Como eu uso o regex em uma consulta SQLite?

Eu gostaria de usar uma expressão regular no sqlite, mas não sei como.

Minha tabela tem uma coluna com strings como esta: “3,12,13,14,19,28,32” Agora, se eu digitar “onde x LIKE ‘3’” eu também obtenho as linhas que contêm valores como 13 ou 32 , mas eu gostaria de obter apenas as linhas que têm exatamente o valor 3 nessa string.

Alguém sabe como resolver isso?

O SQLite3 suporta o operador REGEXP:

WHERE x REGEXP  

Como outros já apontaram, o REGEXP chama uma function definida pelo usuário que deve primeiro ser definida e carregada no database. Talvez algumas distribuições sqlite ou ferramentas GUI o incluam por padrão, mas a minha instalação do Ubuntu não o fez. A solução foi

 sudo apt-get install sqlite3-pcre 

que implementa expressões regulares Perl em um módulo carregável em /usr/lib/sqlite3/pcre.so

Para poder usá-lo, você precisa carregá-lo toda vez que abrir o database:

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

Ou você pode colocar essa linha no seu ~/.sqliterc .

Agora você pode consultar assim:

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

Se você estiver no Windows, acho que um arquivo .dll semelhante deve estar disponível em algum lugar.

Uma maneira hacky de resolvê-lo sem regex é where ',' || x || ',' like '%,3,%' where ',' || x || ',' like '%,3,%'

O SQLite não contém funcionalidade de expressão regular por padrão.

Ele define um operador REGEXP , mas isso falhará com uma mensagem de erro, a menos que você ou sua estrutura definam uma function do usuário chamada regexp() . Como você faz isso vai depender da sua plataforma.

Se você tem uma function regexp() definida, você pode combinar um inteiro arbitrário de uma lista separada por vírgulas da seguinte forma:

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

Mas realmente, parece que você acharia as coisas muito mais fáceis se você normalizasse sua estrutura de database, substituindo esses grupos em uma única coluna por uma linha separada para cada número na lista separada por vírgulas. Então você pode não apenas usar o operador = em vez de uma expressão regular, mas também usar ferramentas relacionais mais poderosas como junções que o SQL fornece para você.

Uma UDF do SQLite em PHP / PDO para a palavra-chave REGEXP que imita o comportamento no MySQL:

 $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; } ); 

O modificador u não é implementado no MySQL, mas acho útil tê-lo por padrão. Exemplos:

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

Se $data ou $pattern for NULL, o resultado será NULL – assim como no MySQL.

Não é bom responder a uma pergunta que foi publicada há quase um ano. Mas estou escrevendo isso para aqueles que acham que o próprio Sqlite fornece a function REGEXP .

Um requisito básico para invocar a function REGEXP no sqlite é
“Você deve criar sua própria function no aplicativo e, em seguida, fornecer o link de retorno de chamada para o driver sqlite” .
Para isso você tem que usar sqlite_create_function (interface C). Você pode encontrar o detalhe aqui e aqui

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

E:

 SELECT * from TableName WHERE YourField REGEXP 'YOUR REGEX' 

Você poderia usar uma expressão regular com REGEXP , mas essa é uma maneira tola de fazer uma correspondência exata.

Você deve apenas dizer WHERE x = '3' .

Considere usar este

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

Isso corresponderá exatamente a 3 quando x estiver em:

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

Outros exemplos:

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

Isso vai combinar em 3 ou 13

minha solução em python com sqlite3:

  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() 

Se a expressão regular corresponder, a saída será 1, caso contrário, 0.

Se você estiver usando o php você pode adicionar qualquer function à sua instrução sql usando: SQLite3 :: createFunction . No PDO você pode usar o PDO :: sqliteCreateFunction e implementar a function preg_match em sua declaração:

Veja como é feito por Havalite ( RegExp no SqLite usando Php )

Uma cláusula where ‘orent’ exaustiva pode ser executada sem concatenação de strings:

 WHERE ( x == '3' OR x LIKE '%,3' OR x LIKE '3,%' OR x LIKE '%,3,%'); 

Inclui os quatro casos de correspondência exata, fim da lista, início da lista e lista intermediária.

Isso é mais detalhado, não requer a extensão regex.