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 "where x LIKE '3'", também obtenho as linhas que contêm valores como 13 ou 32 , mas gostaria de obter apenas as linhas que têm exatamente o valor 3 nessa string.
Alguém sabe como resolver isso?
regex
sqlite
query-string
cody
fonte
fonte
Respostas:
SQLite3 suporta o operador REGEXP:
http://www.sqlite.org/lang_expr.html#regexp
fonte
regex()
função para dar suporte aoREGEXP
operador? Por padrão, uma função de usuário não foi adicionada.Como outros já apontaram, REGEXP chama uma função definida pelo usuário que deve primeiro ser definida e carregada no banco de dados. Talvez algumas distribuições sqlite ou ferramentas GUI incluam por padrão, mas minha instalação do Ubuntu não. A solução foi
que implementa expressões regulares Perl em um módulo carregável em
/usr/lib/sqlite3/pcre.so
Para poder usá-lo, você deve carregá-lo toda vez que abrir o banco de dados:
Ou você pode colocar essa linha no seu
~/.sqliterc
.Agora você pode consultar assim:
Se você deseja consultar diretamente da linha de comando, pode usar a
-cmd
opção para carregar a biblioteca antes do SQL:Se você estiver no Windows, acho que um arquivo .dll semelhante deve estar disponível em algum lugar.
fonte
Uma maneira hacky de resolvê-lo sem regex é
where ',' || x || ',' like '%,3,%'
fonte
',' || x || ','
O SQLite não contém funcionalidade de expressão regular por padrão.
Ele define um
REGEXP
operador, mas falhará com uma mensagem de erro, a menos que você ou sua estrutura definam uma função de usuário chamadaregexp()
. Como você fará isso dependerá da sua plataforma.Se você tem uma
regexp()
função definida, pode corresponder a um número inteiro arbitrário de uma lista separada por vírgulas da seguinte forma:Mas, realmente, parece que você achará as coisas muito mais fáceis se normalizar a estrutura do seu banco de dados substituindo esses grupos em uma única coluna por uma linha separada para cada número na lista separada por vírgulas. Então, você não poderia 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ê.fonte
Um UDF SQLite em PHP / PDO para a
REGEXP
palavra - chave que simula o comportamento no MySQL:O
u
modificador não está implementado no MySQL, mas acho útil tê-lo por padrão. Exemplos:Se
$data
ou$pattern
for NULL, o resultado será NULL - exatamente como no MySQL.fonte
minha solução em python com sqlite3:
se regex corresponder, a saída será 1, caso contrário, 0.
fonte
Não é bom responder a uma pergunta que foi postada quase um ano atrás. Mas estou escrevendo isso para aqueles que pensam que o próprio Sqlite fornece a função REGEXP .
Um requisito básico para invocar a função REGEXP no sqlite é
"Você deve criar sua própria função no aplicativo e, em seguida, fornecer o link de retorno de chamada para o driver sqlite" .
Para isso você deve usar sqlite_create_function (interface C). Você pode encontrar os detalhes aqui e aqui
fonte
E:
fonte
Uma exaustiva cláusula or'ed where pode fazer isso sem concatenação de string:
Inclui a correspondência exata de quatro casos, fim da lista, início da lista e lista intermediária.
Isso é mais detalhado, não requer a extensão regex.
fonte
Com o python, supondo que
con
seja a conexão com o SQLite, você pode definir a UDF necessária escrevendo:Aqui está um exemplo mais completo:
fonte
if x not Null and y not Null and re.search(x,y)
caso contrário, ele vai jogar.Você pode usar uma expressão regular com REGEXP , mas essa é uma maneira boba de fazer uma correspondência exata.
Você deveria apenas dizer
WHERE x = '3'
.fonte
Considere usar isso
Isso corresponderá exatamente a 3 quando x estiver em:
Outros exemplos:
Isso vai combinar em 3 ou 13
fonte
No caso de alguém procurando uma condição sem regex para Android Sqlite , como esta string
[1,2,3,4,5]
, não se esqueça de adicionar colchetes ( [] ) mesmo para outros caracteres especiais como parênteses ( {} ) na condição @phyattfonte
Se estiver usando php, você pode adicionar qualquer função à instrução sql usando: SQLite3 :: createFunction . No PDO, você pode usar PDO :: sqliteCreateFunction e implementar a função preg_match em sua instrução:
Veja como é feito por Havalite ( RegExp em SqLite usando Php )
fonte
Você pode considerar também
Isso permitirá encontrar o número 3 em qualquer string em qualquer posição
fonte
Em Julia, o modelo a seguir pode ser ilustrado da seguinte forma:
fonte
para trilhos
fonte