Masalah dengan Postgresql adalah yang pertama, ia tidak mendukung memiliki grup tangkap dalam pernyataan lookahead-nya. Karena itu, semua grup tangkap dalam lookahead akan diperlakukan sebagai grup non-capture ((?: ... )
), penekanan saya:
Jadi, meskipun PostgreSQL mendukung memiliki referensi balik dalam pandangan ke depan, PostgreSQL masih akan gagal berfungsi seperti yang diharapkan karena batasan di atas (tanpa grup tangkapan, Anda tidak dapat memiliki referensi balik).
Solusi yang mungkin (sayangnya akan panjang untuk persyaratan yang rumit) adalah menghitung jumlah setiap karakter:
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;
[kondisi diambil dan diubah dari jawaban ini ; baris terakhir adalah untuk memastikan hanya ada karakter tersebut dalam string]