Anda tidak perlu keluar dari -
di dalam kelas karakter ketika Anda meletakkannya di posisi pertama atau terakhir, karena itu tidak dapat salah dibaca sebagai rentang seperti itu:
[\- ]
-> [- ]
[\d\- ]
-> [\d -]
Cara Anda memilikinya batas atas 10
pada akhirnya sia-sia.
Tambahkan $
di bagian akhir untuk melarang karakter tambahan.
Atau \D
untuk melarang digit di akhir (tetapi memerlukan non-digit).
Atau ($|\D)
untuk mengakhiri string di sana atau mengikuti non-digit.
Satukan:
SELECT '+79637434199' ~ '^(8|\+7)[ -]?(\(?\d{3}\)?[ -]?)[\d -]{7,10}($|\D)'
Kalau tidak, ekspresi Anda baik-baik saja dan berfungsi untuk saya di PostgreSQL 9.1.4. Seharusnya tidak ada bedanya apakah Anda menggunakannya dalam WHERE
klausa atau dalam SELECT
list - kecuali jika Anda mengalami bug dengan beberapa versi lama (seperti yang disarankan @kgrittn di komentar).
Jika saya menambahkan string literal dengan E
, saya dapat memprovokasi pesan kesalahan yang Anda dapatkan. Ini tidak bisa jelaskan masalah Anda, karena Anda menyatakan bahwa ekspresi berfungsi dengan baik sebagai SELECT
barang.
Namun, seperti dikutip Sherlock Holmes, "ketika Anda telah mengesampingkan hal yang tidak mungkin, apapun yang tersisa, betapapun tidak mungkinnya, pastilah kebenarannya."
Mungkin Anda menjalankan satu tes dengan standard_conforming_strings = on
dan yang lainnya dengan standard_conforming_strings = off
- ini adalah interpretasi default string literal di versi lama sebelum 9.1. Mungkin dengan dua klien yang berbeda (yang memiliki pengaturan berbeda untuk itu).
Baca selengkapnya di bab Konstanta String dengan Escapes gaya-C dalam manual.