Soru Bir SQLite sorgusunda normal ifadeyi nasıl kullanırım?


Ben sqlite düzenli bir ifade kullanmak istiyorum, ama nasıl bilmiyorum.

Masamın şu gibi dizeleri olan bir sütunu var: "3,12,13,14,19,28,32" Şimdi "x LIKE '3" yazdığımda, 13 veya 32 gibi değerleri içeren satırları da alırım. ama sadece bu dizede tam olarak 3 değerine sahip olan satırları almak istiyorum.

Bunu çözmeyi bilen var mı?


76
2018-02-21 21:43


Menşei


Bu cevap REGEXP işlevini sqlite c # içine eklemek için en iyisidir stackoverflow.com/a/26155359/5734452 - hubaishan


Cevaplar:


SQLite3 REGEXP operatörünü destekler:

WHERE x REGEXP <regex>

54
2018-02-21 21:51



Kolay bir yol buldum: Basitçe \ bx \ b Burada x, dizede aranacak değerdir :) - cody
@DanS: Nasıl eklersiniz regex() desteklemek için işlev REGEXP Şebeke? Varsayılan olarak bir kullanıcı işlevi eklenmedi. - SK9
Sqlite docs'a göre: REGEXP operatörü, regexp () kullanıcı işlevi için özel bir sözdizimidir. Regexp () kullanıcı işlevi varsayılan olarak tanımlanmaz ve REGEXP operatörünün kullanılması normalde bir hata mesajıyla sonuçlanır. Çalışma zamanında "regexp" adlı uygulama tanımlı bir SQL işlevi eklenirse, REGEXP işlecini uygulamak için bu işlev çağrılır. (sqlite.org/lang_expr.html#regexp) - radicand
Bunu denediğinizde bir hatayla karşılaşanlarımız için aşağıdaki yanıtı inceleyin stackoverflow.com/a/18484596/1585572 Kodu bir dosyaya koydum ve Firefox sqlite yöneticimdeki Kullanıcı Tanımlı İşlevler'e aktardım. Bunun gibi biraz farklı bir şekilde çağırmanız gerekir, bunun gibi: SELECT * FROM table WHERE column regexp ("myregexp") - Tristan


Diğerleri zaten işaret ettiği gibi, REGEXP, öncelikle tanımlanması ve veritabanına yüklenmesi gereken bir kullanıcı tanımlı işlevi çağırır. Belki bazı sqlite dağıtımları veya GUI araçları varsayılan olarak içerir, ancak Ubuntu yüklememe yapmamıştı. Çözüm oldu

sudo apt-get install sqlite3-pcre

yüklenebilir bir modülde Perl düzenli ifadeleri uygular. /usr/lib/sqlite3/pcre.so

Bunu kullanabilmek için veritabanını her açtığınızda yüklemelisiniz:

.load /usr/lib/sqlite3/pcre.so

Ya da o çizgiyi ~/.sqliterc.

Şimdi şu şekilde sorgulayabilirsiniz:

SELECT fld FROM tbl WHERE fld REGEXP '\b3\b';

Windows'da iseniz, benzer bir .dll dosyasının bir yerde kullanılabilir olduğunu tahmin ediyorum.


87
2017-12-01 08:41



Başka bir yükleme seçeneği: Bunun ile bir görünüm oluşturdum: SELECT load_extension ('/ usr / lib / sqlite3 / pcre.so'); Bu şekilde, DB'ye (Firefox'ta SQLite Manager gibi) GUI tabanlı bir giriş noktası kullandığımda REGEXP yeteneğini yüklemek için bir yolum var. - Paulb


Regex olmadan çözmek için hacky yolu where ',' || x || ',' like '%,3,%'


27
2018-02-21 21:56



Evet, bu şekilde düşündüm, ama her zaman lider ya da takip etmiyor ",". Yine de teşekkürler :-) - cody
@cody, bu yüzden virgülleri ekliyorum x testten önce - çalışmalı .. - Blorgbeard
Ah ... Görüyorum ki bu durumda bir regeeksten bile daha iyi olabilir! Harika! Teşekkürler - cody
Buradaki problemi yanılmamıştım - merak ediyorum ki bu x'in adı sütun adıdır ... - cody
Kullanmalısın ',' || x || ',' - baruch


SQLite, varsayılan olarak normal ifade işlevselliği içermiyor.

Bir tanımlar REGEXP operatörünüz, ancak siz veya çerçeveniz olmadığı sürece bu bir hata mesajıyla başarısız olur kullanıcı işlevini tanımlar denilen regexp(). Bunu nasıl yapacağınız platformunuza bağlı olacaktır.

Eğer bir regexp() işlev tanımlandığında, virgülle ayrılmış bir listeden rastgele bir tamsayı eşleştirebilirsiniz:

... WHERE your_column REGEXP "\b" || your_integer || "\b";

Ama gerçekten, eğer sen bir şeyleri daha kolay bulabilirsin veritabanı yapınızı normalize bunları değiştirerek tek bir sütundaki gruplar virgülle ayrılmış listedeki her sayı için ayrı bir satır. O zaman sadece kullanamazsın = normal bir ifade yerine işleç, ancak SQL'in sizin için sağladığı birleştirmeler gibi daha güçlü ilişkisel araçları da kullanın.


17
2017-11-23 15:24





PHP / PDO'da bir SQLite UDF REGEXP MySQL'deki davranışı taklit eden anahtar kelime:

$pdo->sqliteCreateFunction('regexp',
    function ($pattern, $data, $delimiter = '~', $modifiers = 'isuS')
    {
        if (isset($pattern, $data) === true)
        {
            return (preg_match(sprintf('%1$s%2$s%1$s%3$s', $delimiter, $pattern, $modifiers), $data) > 0);
        }

        return null;
    }
);

u değiştirici MySQL'de uygulanmadı, ancak varsayılan olarak buna sahip olmanın yararını görüyorum. Örnekler:

SELECT * FROM "table" WHERE "name" REGEXP 'sql(ite)*';
SELECT * FROM "table" WHERE regexp('sql(ite)*', "name", '#', 's');

Eğer ikisinden biri $data veya $pattern NULL, sonuç NULL - MySQL'de olduğu gibi.


10
2017-08-28 09:50





Ben neredeyse bir yıl önce yayınlanan bir soruya cevap vermek iyi değil. Ama bunu Sqlite'in kendisinin işlevi sağladığını düşünenler için yazıyorum. regexp.

Sqlite REGEXP işlevini çağırmak için temel bir gereksinim
"Uygulamada kendi işlevinizi oluşturmalı ve sonra sqlite sürücüsüne geri arama bağlantısını sağlamalısınız".
Bunun için sqlite_create_function (C arayüzü) kullanmanız gerekir. Detayını sizden bulabilirsiniz. İşte ve İşte


3
2017-11-09 05:18





UPDATE TableName
 SET YourField = ''
WHERE YourField REGEXP 'YOUR REGEX'

Ve :

SELECT * from TableName
 WHERE YourField REGEXP 'YOUR REGEX'

3
2018-06-30 14:19





İle düzenli bir ifade kullanabilirsiniz regexpama bu tam bir eşleşme yapmanın saçma bir yolu.

Sadece söylemelisin WHERE x = '3'.


2
2018-02-21 21:47



Daha iyi açıklamam gerekirdi (fakir ingilizcem için özür dilerim), tam olarak kesin bir değer değil, tam dizeyi kastediyordum. Yine de teşekkürler! - cody


Bunu kullanmayı düşünün

WHERE x REGEXP '(^|,)(3)(,|$)'

X şu olduğunda tam olarak eşleşecektir:

  • 3
  • 3,12,13
  • 12,13,3
  • 12,3,13

Diğer örnekler:

WHERE x REGEXP '(^|,)(3|13)(,|$)'

Bu 3 veya 13 ile eşleşecek


2
2017-10-27 11:43





sqlite3 ile python benim çözüm:

   import sqlite3
   import re

   def match(expr, item):
        return re.match(expr, item) is not None

   conn = sqlite3.connect(':memory:')
   conn.create_function("MATCHES", 2, match)
   cursor = conn.cursor()
   cursor.execute("SELECT MATCHES('^b', 'busy');")
   print cursor.fetchone()[0]

   cursor.close()
   conn.close()

regex eşleşirse, çıktı 1, aksi takdirde 0 olur.


2
2018-06-05 07:04