PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Postgresql :expression régulière non valide :numéro de référence arrière non valide

Le problème avec Postgresql est que, premièrement, il ne prend pas en charge les groupes de capture dans ses assertions d'anticipation. Cela dit, tous les groupes de capture au sein d'une anticipation seront traités comme des groupes de non-capture ((?: ... ) ), c'est moi qui souligne :

Ainsi, même si PostgreSQL prenait en charge les références arrière dans une anticipation, il ne fonctionnerait toujours pas comme prévu en raison de la contrainte ci-dessus (sans groupe de capture, vous ne pouvez pas avoir de référence arrière).

Une solution de contournement possible (sera longue pour des exigences complexes malheureusement) serait de compter le nombre de chaque caractère :

WHERE
    LENGTH(REGEXP_REPLACE(name, '[^a]+', '', 'g')) < 2 AND
    LENGTH(REGEXP_REPLACE(name, '[^c]+', '', 'g')) < 2 AND
    LENGTH(REGEXP_REPLACE(name, '[^e]+', '', 'g')) < 2 AND
    LENGTH(REGEXP_REPLACE(name, '[^g]+', '', 'g')) < 2 AND
    LENGTH(REGEXP_REPLACE(name, '[^i]+', '', 'g')) < 3 AND
    LENGTH(REGEXP_REPLACE(name, '[acegi]+', '', 'g')) = 0;

[condition tirée et modifiée de cette réponse ; la dernière ligne sert à s'assurer qu'il n'y a que ces caractères dans la chaîne]