Por que usar um caractere de sublinhado em um filtro LIKE me dá todos os resultados?

118

Escrevi a consulta SQL abaixo com uma LIKEcondição:

SELECT * FROM Manager
WHERE managerid LIKE '_%'
AND managername LIKE '%_%'

No LIKEdesejo procurar qualquer sublinhado %_%, mas sei que os dados de minhas colunas não têm caracteres de sublinhado.

  • Por que a consulta me fornece todos os registros da tabela?

Dados de amostra:

create table Manager(
    id int
    ,managerid varchar(3)
    ,managername varchar(50)
    );

insert into Manager(id,managerid,managername)values(1,'A1','Mangesh');
insert into Manager(id,managerid,managername)values(2,'A2','Sagar');
insert into Manager(id,managerid,managername)values(3,'C3','Ahmad');
insert into Manager(id,managerid,managername)values(4,'A4','Mango');
insert into Manager(id,managerid,managername)values(5,'B5','Sandesh');

Sql-Fiddle

IMORTAL
fonte
1
É bom adicionar uma consulta sql-fiddle, mas você deve sempre mostrar a consulta no SO como texto simples. Caso contrário, esta questão é vulnerável à podridão de link .
Tim Schmelter,
_ :: Um substituto para um único caractere
vhadalgi
Possível duplicata do SQL Server 2000/5 Escape an Underscore
azulado de

Respostas:

193

Modifique sua WHEREcondição assim:

WHERE mycolumn LIKE '%\_%' ESCAPE '\'

Essa é uma das maneiras pelas quais o Oracle oferece suporte a caracteres de escape. Aqui você define o caractere de escape com a escapepalavra - chave. Para obter detalhes, consulte este link no Oracle Docs .

O '_'e '%'são curingas em uma LIKEinstrução operada em SQL.

O _personagem procura a presença de (qualquer) um único personagem. Se procurar por columnName LIKE '_abc', ele vai te dar resultado com linhas tendo 'aabc', 'xabc', '1abc', '#abc'mas NÃO 'abc', 'abcc', 'xabcd'e assim por diante.

O '%'caractere é usado para corresponder a 0 ou mais caracteres. Isso significa que, se você procurar por columnName LIKE '%abc', ele vai te dar resultar em ter 'abc', 'aabc', 'xyzabc'e assim por diante, mas não 'xyzabcd', 'xabcdd'e qualquer outra seqüência que não termina com 'abc'.

No seu caso, você pesquisou por '%_%'. Isso fornecerá todas as linhas com aquela coluna tendo um ou mais caracteres, ou seja, quaisquer caracteres, como seu valor. É por isso que você está obtendo todas as linhas, embora não haja _valores em suas colunas.

Rachcha
fonte
Eu enfrento o mesmo problema no acesso Db. pode me dizer como posso resolver esse problema.
Talvez você possa pesquisar no Google por 'curingas no banco de dados de acesso'. Nunca trabalhei no Access, então não posso ajudá-lo com isso. Tenho até dúvidas se o Access suporta likeoperadora. Minha solução funcionará na maioria, senão em todos os bancos de dados.
Rachcha
2
O que não foi declarado aqui é que isso também funciona no SQL Server - o que inicialmente me deixou sem saber por que o OP aceitou uma resposta para o Oracle SQL, quando eles próprios marcaram a pergunta para o SQL Server. Pelo menos a resposta deve ser escrita para visar principalmente o DBMS originalmente marcado.
sublinhado_d
87

O sublinhado é o curinga em umaLIKE consulta para um caractere arbitrário.

Portanto, LIKE %_%significa "me dê todos os registros com pelo menos um caractere arbitrário nesta coluna".

Você tem que escapar do caractere curinga, em sql-server com []cerca de:

SELECT m.* 
FROM Manager m 
WHERE m.managerid    LIKE  '[_]%'
AND   m.managername  LIKE '%[_]%'

Consulte: LIKE (Transact-SQL)

Demo

Tim Schmelter
fonte
Obrigado por fornecer o link do MSDN em sua resposta. Eu estava tendo dificuldade em localizar informações sobre o caractere especial de sublinhado até ler sua postagem.
Chris Smith,
5
Esta é a resposta correta, já que o usuário especificou a sql-servertag em sua pergunta e o SQLFiddle fornecido também é designado como MS SQL Server 2008.
Govind Rai
8

Como você deseja pesquisar especificamente por um caractere curinga, você precisa escapar disso

Isso é feito adicionando a ESCAPEcláusula à sua LIKEexpressão. O caractere especificado com a ESCAPEcláusula "invalidará" o seguinte caractere curinga.

Você pode usar qualquer caractere que desejar (não apenas um caractere curinga). A maioria das pessoas usa um \porque é isso que muitas linguagens de programação também usam

Portanto, sua consulta resultaria em:

select * 
from Manager
where managerid LIKE '\_%' escape '\'
and managername like '%\_%' escape '\';

Mas você também pode usar qualquer outro caractere:

select * 
from Manager
where managerid LIKE '#_%' escape '#'
and managername like '%#_%' escape '#';

Aqui está um exemplo de SQLFiddle: http://sqlfiddle.com/#!6/63e88/4

um cavalo sem nome
fonte
5

O sublinhado é um caractere curinga para alguma coisa. por exemplo 'A_%' irá procurar por todas as correspondências que começam com 'A' e tem no mínimo 1 caractere extra depois disso

Franck
fonte
0

Você pode escrever a consulta conforme abaixo:

SELECT * FROM Manager
WHERE managerid LIKE '\_%' escape '\'
AND managername LIKE '%\_%' escape '\';

vai resolver o seu problema.

Sonali Lad
fonte
Como isso adiciona algo além da resposta aceita?
Noah Broyles
0

Caso as pessoas estejam pesquisando como fazer no BigQuery:

  • Um sublinhado "_" corresponde a um único caractere ou byte.

  • Você pode escapar de "\", "_" ou "%" usando duas barras invertidas. Por exemplo, "\%". Se você estiver usando strings brutas, apenas uma única barra invertida será necessária. Por exemplo, r "\%".

WHERE mycolumn LIKE '%\\_%'

Fonte: https://cloud.google.com/bigquery/docs/reference/standard-sql/operators

p1nox
fonte