Saya ingin menggunakan ekspresi reguler dalam sqlite, tetapi saya tidak tahu caranya.
Tabel saya memiliki kolom dengan string seperti ini: "3,12,13,14,19,28,32" Sekarang jika saya mengetik "di mana x LIKE '3'" saya juga mendapatkan baris yang berisi nilai seperti 13 atau 32 , tapi saya hanya ingin mendapatkan baris yang memiliki nilai persis 3 dalam string itu.
Apakah ada yang tahu bagaimana mengatasi ini?
regex
sqlite
query-string
cody
sumber
sumber
Jawaban:
SQLite3 mendukung operator REGEXP:
http://www.sqlite.org/lang_expr.html#regexp
sumber
regex()
fungsi untuk mendukungREGEXP
operator? Secara default, fungsi pengguna belum ditambahkan.Seperti yang telah ditunjukkan oleh orang lain, REGEXP memanggil fungsi yang ditentukan pengguna yang harus didefinisikan terlebih dahulu dan dimuat ke dalam database. Mungkin beberapa distribusi sqlite atau alat GUI memasukkannya secara default, tetapi pemasangan Ubuntu saya tidak. Solusinya adalah
yang mengimplementasikan ekspresi reguler Perl dalam modul yang dapat dimuat di
/usr/lib/sqlite3/pcre.so
Untuk dapat menggunakannya, Anda harus memuatnya setiap kali Anda membuka database:
Atau Anda bisa memasukkan baris itu ke file
~/.sqliterc
.Sekarang Anda dapat melakukan kueri seperti ini:
Jika Anda ingin membuat kueri langsung dari baris perintah, Anda dapat menggunakan
-cmd
sakelar untuk memuat pustaka sebelum SQL Anda:Jika Anda menggunakan Windows, saya kira file .dll serupa harus tersedia di suatu tempat.
sumber
Cara hacky untuk menyelesaikannya tanpa regex adalah
where ',' || x || ',' like '%,3,%'
sumber
',' || x || ','
SQLite tidak berisi fungsionalitas ekspresi reguler secara default.
Ini mendefinisikan
REGEXP
operator, tetapi ini akan gagal dengan pesan kesalahan kecuali Anda atau kerangka kerja Anda menentukan fungsi pengguna yang dipanggilregexp()
. Bagaimana Anda melakukan ini akan bergantung pada platform Anda.Jika Anda memiliki
regexp()
fungsi yang ditentukan, Anda dapat mencocokkan bilangan bulat arbitrer dari daftar yang dipisahkan koma seperti:Tapi sungguh, sepertinya Anda akan menemukan hal-hal jauh lebih mudah jika Anda menormalkan struktur database Anda dengan mengganti grup tersebut dalam satu kolom dengan baris terpisah untuk setiap nomor dalam daftar yang dipisahkan koma. Kemudian Anda tidak hanya dapat menggunakan
=
operator alih-alih ekspresi reguler, tetapi juga menggunakan alat relasional yang lebih canggih seperti gabungan yang disediakan SQL untuk Anda.sumber
UDF SQLite di PHP / PDO untuk
REGEXP
kata kunci yang meniru perilaku di MySQL:The
u
pengubah tidak diterapkan di MySQL, tapi saya merasa berguna untuk memilikinya secara default. Contoh:Jika salah satu
$data
atau$pattern
adalah NULL, hasilnya adalah NULL - seperti di MySQL.sumber
solusi saya dengan python dengan sqlite3:
jika regex cocok, outputnya adalah 1, jika tidak 0.
sumber
I don't it is good untuk menjawab pertanyaan yang diposting hampir setahun yang lalu. Tetapi saya menulis ini untuk mereka yang berpikir bahwa Sqlite sendiri menyediakan fungsi REGEXP .
Satu persyaratan dasar untuk menjalankan fungsi REGEXP di sqlite adalah
"Anda harus membuat fungsi Anda sendiri di aplikasi dan kemudian memberikan link callback ke driver sqlite" .
Untuk itu Anda harus menggunakan sqlite_create_function (C interface). Anda dapat menemukan detailnya dari sini dan sini
sumber
Dan:
sumber
Sebuah or'ed lengkap di mana klausa dapat melakukannya tanpa penggabungan string:
Termasuk empat kasus yang sama persis, akhir daftar, awal daftar, dan daftar tengah.
Ini lebih bertele-tele, tidak memerlukan ekstensi regex.
sumber
Dengan python, dengan asumsi
con
adalah koneksi ke SQLite, Anda dapat menentukan UDF yang diperlukan dengan menulis:Berikut contoh yang lebih lengkap:
sumber
if x not Null and y not Null and re.search(x,y)
sebaliknya itu akan melempar.Anda dapat menggunakan ekspresi reguler dengan REGEXP , tetapi itu adalah cara konyol untuk melakukan pencocokan tepat.
Anda hanya harus mengatakan
WHERE x = '3'
.sumber
Pertimbangkan untuk menggunakan ini
Ini akan sama persis dengan 3 ketika x ada di:
Contoh lain:
Ini akan cocok pada 3 atau 13
sumber
Jika seseorang mencari kondisi non-regex untuk Android Sqlite , seperti string ini
[1,2,3,4,5]
maka jangan lupa untuk menambahkan tanda kurung ( [] ) yang sama untuk karakter khusus lainnya seperti tanda kurung ( {} ) dalam kondisi @phyattsumber
Jika Anda menggunakan php, Anda dapat menambahkan fungsi apa pun ke pernyataan sql Anda dengan menggunakan: SQLite3 :: createFunction . Di PDO Anda dapat menggunakan PDO :: sqliteCreateFunction dan mengimplementasikan fungsi preg_match dalam pernyataan Anda:
Lihat bagaimana ini dilakukan oleh Havalite ( RegExp di SqLite menggunakan Php )
sumber
Anda juga bisa mempertimbangkan
Ini akan memungkinkan menemukan nomor 3 dalam string apa pun di posisi mana pun
sumber
Dalam Julia, model yang diikuti dapat diilustrasikan sebagai berikut:
sumber
untuk rel
sumber