No SQL I (infelizmente) muitas vezes é necessário usar LIKE
condições " " devido a bancos de dados que violam quase todas as regras de normalização. Não posso mudar isso agora. Mas isso é irrelevante para a questão.
Além disso, costumo usar condições como WHERE something in (1,1,2,3,5,8,13,21)
para melhor legibilidade e flexibilidade de minhas instruções SQL.
Existe alguma maneira possível de combinar essas duas coisas sem escrever sub-seleções complicadas?
Eu quero algo tão fácil quanto, em WHERE something LIKE ('bla%', '%foo%', 'batz%')
vez disso:
WHERE something LIKE 'bla%'
OR something LIKE '%foo%'
OR something LIKE 'batz%'
Estou trabalhando com o SQl Server e Oracle aqui, mas estou interessado se isso for possível em qualquer RDBMS.
like any
/ do Teradatalike all
: stackoverflow.com/questions/40475982/sql-like-any-vs-like-all . (Para constar, isso foi solicitado no fórum Oracle Community Ideas community.oracle.com/ideas/11592 )Respostas:
Não há combinação de LIKE & IN no SQL, muito menos no TSQL (SQL Server) ou PLSQL (Oracle). Parte do motivo disso é porque a Pesquisa de Texto Completo (STF) é a alternativa recomendada.
As implementações Oracle e SQL Server FTS suportam a palavra-chave CONTAINS, mas a sintaxe ainda é um pouco diferente:
Oráculo:
Servidor SQL:
A coluna que você está consultando deve ser indexada em texto completo.
Referência:
fonte
Se você deseja tornar sua declaração facilmente legível, use REGEXP_LIKE (disponível a partir do Oracle versão 10).
Uma tabela de exemplo:
A sintaxe original:
E uma consulta simples com REGEXP_LIKE
MAS ...
Eu não recomendaria eu mesmo devido ao desempenho não tão bom. Eu ficaria com os vários predicados LIKE. Portanto, os exemplos foram apenas por diversão.
fonte
você está preso com o
a menos que você preencha uma tabela temporária (inclua os curingas com os dados) e ingresse da seguinte maneira:
experimente (usando a sintaxe do SQL Server):
RESULTADO:
fonte
LIKE 'bla%'
, que no código de exemplo do OP? ou só pode fazerLIKE '%bla%'
pesquisas?Com o PostgreSQL, existe o formulário
ANY
ouALL
:ou
onde a subseleção retorna exatamente uma coluna de dados.
fonte
LIKE ANY
eLIKE ALL
comum a todos os dialetos SQL, ou seja, parte da linguagem do núcleo, ou específica para um dialeto?= ANY
ou<> ALL
funciona apenas no SQL, não no PLSQL, por exemplo.Outra solução, deve funcionar em qualquer RDBMS:
fonte
Sugiro que você use uma função de usuário TableValue se desejar encapsular as técnicas de junção interna ou de tabela temporária mostradas acima. Isso permitiria ler um pouco mais claramente.
Depois de usar a função de divisão definida em: http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx
podemos escrever o seguinte com base em uma tabela que criei chamada "Fish" (int id, varchar (50) Name)
Saídas
fonte
Uma abordagem seria armazenar as condições em uma tabela temporária (ou variável de tabela no SQL Server) e ingressar nessa:
fonte
Use uma junção interna:
fonte
O Teradata suporta a sintaxe de ALL / ANY :
EDITAR:
O jOOQ versão 3.12.0 suporta essa sintaxe:
Adicione operadores sintéticos [NOT] LIKE ANY e [NOT] LIKE ALL
PostgreSQL
LIKE/ILIKE ANY (ARRAY[])
:db <> demo de violino
O Snowflake também suporta a correspondência LIY ANY / LIKE ALL :
Exemplo:
fonte
você pode até tentar isso
Função
Inquerir
fonte
Eu tenho uma solução simples, que funciona pelo menos no postgresql , usando
like any
seguido pela lista de regex. Aqui está um exemplo, procurando identificar alguns antibióticos em uma lista:fonte
Eu também estava pensando em algo assim. Eu apenas testada usando uma combinação de
SUBSTRING
eIN
e é uma solução eficaz para este tipo de problema. Tente a consulta abaixo:fonte
No Oracle, você pode usar uma coleção da seguinte maneira:
Aqui, usei um tipo de coleção predefinido
ku$_vcnt
, mas você pode declarar o seu próprio como este:fonte
Para o Sql Server, você pode recorrer ao SQL dinâmico.
Na maioria das vezes, nessas situações, você tem o parâmetro da cláusula IN com base em alguns dados do banco de dados.
O exemplo abaixo é um pouco "forçado", mas isso pode corresponder a vários casos reais encontrados nos bancos de dados herdados.
Suponha que você tenha pessoas da tabela em que os nomes das pessoas são armazenados em um único campo PersonName como Nome + '' + Sobrenome. Você precisa selecionar todas as pessoas de uma lista de nomes, armazenada no campo NameToSelect na tabela NamesToSelect , além de alguns critérios adicionais (como filtrados por sexo, data de nascimento, etc.)
Você pode fazer o seguinte
fonte
Talvez eu tenha uma solução para isso, embora funcione apenas no SQL Server 2008 até onde sei. Descobri que você pode usar o construtor de linhas descrito em https://stackoverflow.com/a/7285095/894974 para ingressar em uma tabela 'fictícia' usando uma cláusula like. Parece mais complexo do que é, veja:
Isso resultará em todos os usuários com um endereço de email como os fornecidos na lista. Espero que seja útil para qualquer pessoa. O problema estava me incomodando há um tempo.
fonte
A partir de 2016, o SQL Server inclui uma
STRING_SPLIT
função . Estou usando o SQL Server v17.4 e consegui que isso funcionasse para mim:fonte
Se você estiver usando o MySQL, o mais próximo possível é a pesquisa de texto completo:
Pesquisa de texto completo, documentação MySQL
fonte
Isso funciona para valores separados por vírgula
Avalia para:
Se você deseja usar índices, deve omitir o primeiro
'%'
caractere.fonte
No Oracle RBDMS, você pode obter esse comportamento usando a função REGEXP_LIKE .
O código a seguir testará se a sequência três está presente na expressão de lista um | dois | três | quatro | cinco (em que o símbolo " | " do tubo significa operação lógica OU).
A expressão precedente é equivalente a:
Então, terá sucesso.
Por outro lado, o teste a seguir falhará.
Existem várias funções relacionadas a expressões regulares (REGEXP_ *) disponíveis no Oracle desde a versão 10g. Se você é um desenvolvedor Oracle e está interessado neste tópico, este deve ser um bom começo para Usar expressões regulares com o banco de dados Oracle .
fonte
Pode ser que você pense que a combinação assim:
Se você definiu o índice de texto completo para sua tabela de destino, poderá usar esta alternativa:
fonte
Nenhuma resposta como esta:
No oracle não há problema.
fonte
No Teradata você pode usar
LIKE ANY ('%ABC%','%PQR%','%XYZ%')
. Abaixo está um exemplo que produziu os mesmos resultados para mimfonte
Sei que é muito tarde, mas tive uma situação semelhante. Eu precisava de um operador "Like In" para um conjunto de procedimentos armazenados que tenho, que aceita muitos parâmetros e os utiliza para agregar dados de vários sistemas RDBMS, portanto, nenhum truque específico do RDBMS funcionaria, no entanto, o procedimento armazenado e quaisquer funções será executado no MS SQL Server, para que possamos usar o T-SQL para a funcionalidade de gerar as instruções SQL completas para cada RDBMS, mas a saída precisa ser bastante independente do RDBMS.
É isso que eu criei no momento para transformar uma string delimitada (como um parâmetro que entra em um procedimento armazenado) em um bloco de SQL. Eu chamo de "Líquen" para "LIKE IN". Pegue?
Lichen.sql
A detecção do delimitador é possivelmente planejada, mas, por enquanto, o padrão é um ponto-e-vírgula, para que você possa colocar
default
lá. Provavelmente existem erros nisso. O@leadingAnd
parâmetro é apenas um valor de bit para determinar se você deseja colocar um "AND" inicial na frente do bloco para que ele se encaixe perfeitamente com outras adições à cláusula WHERE.Exemplo de uso (com delimitador em argString)
Retornará um nvarchar (512) contendo:
Ele também ignorará o bloco se a entrada não contiver um delimitador:
Exemplo de uso (sem delimitador em argString)
Retornará um nvarchar (512) contendo:
Vou continuar trabalhando nisso, por isso, se negligenciei algo (claramente óbvio ou não), fique à vontade para comentar ou entrar em contato.
fonte
faça isso
ou
fonte