Perché l'utilizzo di un carattere di sottolineatura in un filtro MI PIACE mi dà tutti i risultati?


118

Ho scritto la seguente query SQL con una LIKEcondizione:

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

In LIKEVoglio cercare eventuali trattini bassi %_%, ma so che i dati delle mie colonne non hanno caratteri di sottolineatura.

  • Perché la query mi fornisce tutti i record della tabella?

Dati di esempio:

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


1
È bello aggiungere una query sql-fiddle, ma dovresti sempre mostrare la query su SO come testo normale. Altrimenti questa domanda è vulnerabile al link rot .
Tim Schmelter

_ :: Un sostituto per un singolo carattere
vhadalgi

Risposte:


193

Modifica la tua WHEREcondizione in questo modo:

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

Questo è uno dei modi in cui Oracle supporta i caratteri di escape. Qui si definisce il carattere di escape con la escapeparola chiave. Per i dettagli vedere questo collegamento su Oracle Docs .

L' '_'e '%'sono i caratteri jolly in un LIKEcomunicato operato in SQL.

Il _personaggio cerca la presenza di (qualsiasi) un singolo carattere. Se si esegue una ricerca per columnName LIKE '_abc', che vi darà risultato con filari avere 'aabc', 'xabc', '1abc', '#abc'ma NON 'abc', 'abcc', 'xabcd'e così via.

Il '%'carattere viene utilizzato per la corrispondenza di 0 o più numeri di caratteri. Ciò significa che, se si cerca con columnName LIKE '%abc', esso vi darà risultato di avere 'abc', 'aabc', 'xyzabc'e così via, ma non 'xyzabcd', 'xabcdd'e qualsiasi altra stringa che non si esaurisce con 'abc'.

Nel tuo caso hai cercato per '%_%'. In questo modo tutte le righe con quella colonna avranno uno o più caratteri, ovvero qualsiasi carattere, come valore. Questo è il motivo per cui ricevi tutte le righe anche se non ci sono _valori nelle colonne.


Devo affrontare lo stesso problema nell'accesso Db. puoi dirmi come posso risolvere questo problema.

Forse puoi cercare su Google i "caratteri jolly nel database di accesso". Non ho mai lavorato su Access, quindi non posso aiutarti. Dubito persino che Access supporti l' likeoperatore. La mia soluzione funzionerà nella maggior parte, se non in tutti, i database.
Rachcha

2
Ciò che non è indicato qui è che questo funziona anche su SQL Server, il che inizialmente mi ha lasciato a bocca aperta sul motivo per cui l'OP ha accettato una risposta per Oracle SQL, quando loro stessi hanno taggato la domanda per SQL Server. Almeno la risposta dovrebbe essere scritta per indirizzare principalmente il DBMS originariamente etichettato.
underscore_d

87

Il carattere di sottolineatura è il carattere jolly in unaLIKE query per un carattere arbitrario.

Quindi LIKE %_%significa "dammi tutti i record con almeno un carattere arbitrario in questa colonna".

Devi sfuggire al carattere jolly, in sql-server con []intorno:

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

Vedere: LIKE (Transact-SQL)

Demo


Grazie per aver fornito il collegamento MSDN nella risposta. Ho avuto difficoltà a trovare informazioni sul carattere speciale di sottolineatura finché non ho letto il tuo post.
Chris Smith

5
Questa è la risposta corretta poiché l'utente ha specificato il sql-servertag nella domanda e il SQLFiddle fornito è anche designato come MS SQL Server 2008.
Govind Rai

8

Dato che vuoi cercare specificamente un carattere jolly, devi evitarlo

Questo viene fatto aggiungendo la ESCAPEclausola alla tua LIKEespressione. Il carattere specificato con la ESCAPEclausola "invaliderà" il seguente carattere jolly.

Puoi usare qualsiasi carattere che ti piace (solo non un carattere jolly). La maggior parte delle persone usa un \perché è quello che usano anche molti linguaggi di programmazione

Quindi la tua query risulterebbe in:

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

Ma puoi anche usare qualsiasi altro personaggio:

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

Ecco un esempio di SQLFiddle: http://sqlfiddle.com/#!6/63e88/4


5

Il carattere di sottolineatura è un carattere jolly per qualcosa. ad esempio "A_%" cercherà tutte le corrispondenze che iniziano con "A" e dopo avranno almeno 1 carattere in più


0

Puoi scrivere la query come di seguito:

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

risolverà il tuo problema.


In che modo questo aggiunge qualcosa oltre alla risposta accettata?
Noah Broyles

0

Nel caso in cui le persone stiano cercando come farlo in BigQuery:

  • Un carattere di sottolineatura "_" corrisponde a un singolo carattere o byte.

  • Puoi eseguire l'escape di "\", "_" o "%" utilizzando due barre rovesciate. Per esempio, "\%". Se stai usando stringhe non elaborate, è richiesta solo una singola barra rovesciata. Ad esempio, r "\%".

WHERE mycolumn LIKE '%\\_%'

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.