Como faço para usar regex em uma consulta SQLite?
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.
Esta resposta é a melhor para adicionar a função REGEXP ao sqlite em c # stackoverflow.com/a/26155359/5734452
— hubaishan
SQLite3 suporta o operador REGEXP:
Encontrei uma maneira fácil: é simplesmente \ bx \ b, em que x é o valor a ser procurado na string :)
@DanS: Como você adiciona uma regex()função para dar suporte ao REGEXPoperador? Por padrão, uma função de usuário não foi adicionada.
De acordo com os documentos do Sqlite: O operador REGEXP é uma sintaxe especial para a função de usuário regexp (). Nenhuma função de usuário regexp () é definida por padrão e, portanto, o uso do operador REGEXP normalmente resultará em uma mensagem de erro. Se uma função SQL definida pelo aplicativo chamada "regexp" for adicionada em tempo de execução, essa função será chamada para implementar o operador REGEXP. ( sqlite.org/lang_expr.html#regexp )
— radicand
Para aqueles de nós que obtêm um erro ao tentar fazer isso, verifique a resposta abaixo stackoverflow.com/a/18484596/1585572 Eu coloquei o código em um arquivo e importei-o nas Funções definidas pelo usuário em meu gerenciador de sqlite do Firefox. Você precisa invocá-lo de forma um pouco diferente, como este: SELECT * FROM tabela WHERE coluna regexp ("myregexp")
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 -cmdopçã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.
Outra opção de carregamento: Criei uma visão com este: SELECT load_extension ('/ usr / lib / sqlite3 / pcre.so'); Dessa forma, quando eu uso um ponto de entrada baseado em GUI para o banco de dados (como SQLite Manager no Firefox), tenho uma maneira de carregar o recurso REGEXP.
— Paulb de
Uma maneira hacky de resolvê-lo sem regex é where ',' || x || ',' like '%,3,%'
Sim, eu pensei dessa forma, mas não há orientação ou seguimento "," toda vez. Obrigado de qualquer maneira :-)
Não me deparei com o problema aqui - me pergunto se isso funciona porque x é o nome da coluna ...
Você deve usar',' || x || ','
O SQLite não contém funcionalidade de expressão regular por padrão.
Ele define um REGEXPoperador, 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ê.
Um UDF SQLite em PHP / PDO para a REGEXPpalavra - chave que simula o comportamento no MySQL:
O umodificador não está implementado no MySQL, mas acho útil tê-lo por padrão. Exemplos:
Se $dataou $patternfor NULL, o resultado será NULL - exatamente como no MySQL.
minha solução em python com sqlite3:
se regex corresponder, a saída será 1, caso contrário, 0.
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
— Naved
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.
Com o python, supondo que conseja a conexão com o SQLite, você pode definir a UDF necessária escrevendo:
Aqui está um exemplo mais completo:
Verificação IMHO deve ser 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'.
Eu deveria ter explicado melhor (desculpe pelo meu inglês pobre), eu quis dizer apenas um determinado valor exato, não a string exata. Obrigado mesmo assim!
Considere usar isso
Isso corresponderá exatamente a 3 quando x estiver em:
Isso vai combinar em 3 ou 13
— itsjavi
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 @phyatt
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: