sql >> Database >  >> RDS >> PostgreSQL

Postgresql:Ongeldige reguliere expressie:ongeldig backreferentienummer

Het probleem met Postgresql is dat het ten eerste geen ondersteuning biedt voor capture-groepen binnen zijn vooruitziende beweringen. Dat gezegd hebbende, worden alle capture-groepen binnen een vooruitblik behandeld als niet-capture-groepen ((?: ... ) ), benadruk de mijne:

Dus zelfs als PostgreSQL het hebben van back-referenties binnen een vooruitblik zou ondersteunen, zou het nog steeds niet werken zoals verwacht vanwege de bovenstaande beperking (zonder een capture-groep kun je geen back-reference hebben).

Een mogelijke oplossing (zal helaas lang duren voor complexe vereisten) zou zijn om het aantal van elk teken te tellen:

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;

[voorwaarde overgenomen en gewijzigd van dit antwoord ; de laatste rij is om ervoor te zorgen dat er alleen die karakters in de string voorkomen]



  1. PostgreSQL:vul NULL-waarden in timeserie-query met vorige waarde

  2. Verticale randen toevoegen aan uw SQL*Plus / SQLcl-uitvoerraster

  3. Voeg een kolom toe aan een tabel met een standaardwaarde die gelijk is aan de waarde van een bestaande kolom

  4. Toptrends in databasebeheer