Ricerca…
Sintassi
Wild Card con%: SELECT * FROM [table] WHERE [column_name] Like '% Value%'
Wild Card con _: SELECT * FROM [table] WHERE [column_name] Come 'V_n%'
Wild Card con [charlist]: SELECT * FROM [table] WHERE [column_name] Like 'V [abc] n%'
Osservazioni
La condizione LIKE nella clausola WHERE viene utilizzata per cercare valori di colonna corrispondenti al modello specificato. I modelli sono formati usando i seguenti due caratteri jolly
- % (Simbolo percentuale): utilizzato per rappresentare zero o più caratteri
- _ (Sottolineatura) - Usato per rappresentare un singolo carattere
Abbina il modello aperto
Il carattere jolly %
aggiunto all'inizio o alla fine (o entrambi) di una stringa consentirà che 0 o più di qualsiasi carattere prima dell'inizio o dopo la fine del modello corrisponda.
L'utilizzo di '%' nel mezzo consentirà che 0 o più caratteri tra le due parti del modello corrispondano.
Utilizzeremo questa tabella dei dipendenti:
Id | FName | LName | Numero di telefono | ManagerID | DepartmentID | Stipendio | Data di assunzione |
---|---|---|---|---|---|---|---|
1 | John | Johnson | 2468101214 | 1 | 1 | 400 | 23-03-2005 |
2 | Sophie | Amudsen | 2479100211 | 1 | 1 | 400 | 11-01-2010 |
3 | Ronny | fabbro | 2462544026 | 2 | 1 | 600 | 2015/06/08 |
4 | Jon | Sanchez | 2454124602 | 1 | 1 | 400 | 23-03-2005 |
5 | Hilde | Knag | 2468021911 | 2 | 1 | 800 | 01-01-2000 |
Seguendo le corrispondenze delle istruzioni per tutti i record con FName contenente la stringa "on" dalla tabella dei dipendenti.
SELECT * FROM Employees WHERE FName LIKE '%on%';
Id | FName | LName | Numero di telefono | ManagerID | DepartmentID | Stipendio | Data di assunzione |
---|---|---|---|---|---|---|---|
3 | R on ny | fabbro | 2462544026 | 2 | 1 | 600 | 2015/06/08 |
4 | J on | Sanchez | 2454124602 | 1 | 1 | 400 | 23-03-2005 |
La seguente istruzione corrisponde a tutti i record che hanno PhoneNumber che inizia con la stringa "246" dei dipendenti.
SELECT * FROM Employees WHERE PhoneNumber LIKE '246%';
Id | FName | LName | Numero di telefono | ManagerID | DepartmentID | Stipendio | Data di assunzione |
---|---|---|---|---|---|---|---|
1 | John | Johnson | 246 8101214 | 1 | 1 | 400 | 23-03-2005 |
3 | Ronny | fabbro | 246 2544026 | 2 | 1 | 600 | 2015/06/08 |
5 | Hilde | Knag | 246 8021911 | 2 | 1 | 800 | 01-01-2000 |
La seguente istruzione corrisponde a tutti i record che hanno PhoneNumber che termina con la stringa "11" di Employees.
SELECT * FROM Employees WHERE PhoneNumber LIKE '%11'
Id | FName | LName | Numero di telefono | ManagerID | DepartmentID | Stipendio | Data di assunzione |
---|---|---|---|---|---|---|---|
2 | Sophie | Amudsen | 24791002 11 | 1 | 1 | 400 | 11-01-2010 |
5 | Hilde | Knag | 24680219 11 | 2 | 1 | 800 | 01-01-2000 |
Tutti i record in cui Fname 3 ° carattere è 'n' da Impiegati.
SELECT * FROM Employees WHERE FName LIKE '__n%';
(due trattini bassi vengono usati prima di 'n' per saltare i primi 2 caratteri)
Id | FName | LName | Numero di telefono | ManagerID | DepartmentID | Stipendio | Data di assunzione |
---|---|---|---|---|---|---|---|
3 | Ronny | fabbro | 2462544026 | 2 | 1 | 600 | 2015/06/08 |
4 | Jon | Sanchez | 2454124602 | 1 | 1 | 400 | 23-03-2005 |
Partita a singolo carattere
Per ampliare le selezioni di un'istruzione di linguaggio di query strutturata (SQL-SELECT), è possibile utilizzare i caratteri jolly, il segno di percentuale (%) e il carattere di sottolineatura (_).
Il carattere _
(carattere di sottolineatura) può essere utilizzato come carattere jolly per ogni singolo carattere in una corrispondenza di modello.
Trova tutti i dipendenti i cui Fname iniziano con 'j' e terminano con 'n' e ha esattamente 3 caratteri in Fname.
SELECT * FROM Employees WHERE FName LIKE 'j_n'
_
(carattere di sottolineatura) può essere utilizzato anche più di una volta come carattere jolly per abbinare i motivi.
Ad esempio, questo modello corrisponderebbe a "jon", "jan", "jen", ecc.
Questi nomi non verranno visualizzati "jn", "john", "jordan", "justin", "jason", "julian", "jillian", "joann" perché nella nostra query viene usato un carattere di sottolineatura e può saltare esattamente un personaggio, quindi il risultato deve essere di 3 caratteri Fname.
Ad esempio, questo modello corrisponderebbe a "LaSt", "LoSt", "HaLt", ecc.
SELECT * FROM Employees WHERE FName LIKE '_A_T'
Corrispondenza per intervallo o set
Abbina qualsiasi carattere singolo nell'intervallo specificato (es: [af]
) o impostato (es: [abcdef]
).
Questo modello di gamma corrisponderebbe a "gary" ma non a "mary":
SELECT * FROM Employees WHERE FName LIKE '[a-g]ary'
Questo schema impostato corrisponderebbe a "mary" ma non a "gary":
SELECT * FROM Employees WHERE Fname LIKE '[lmnop]ary'
L'intervallo o l'insieme possono anche essere negati aggiungendo il carattere ^
prima dell'intervallo o del set:
Questo modello di intervallo non corrisponderebbe a "gary" ma corrisponderà a "mary":
SELECT * FROM Employees WHERE FName LIKE '[^a-g]ary'
Questo schema impostato non corrisponderebbe a "mary" ma corrisponderà a "gary":
SELECT * FROM Employees WHERE Fname LIKE '[^lmnop]ary'
Abbina QUALSIASI contro TUTTI
Abbina qualsiasi:
Deve corrispondere ad almeno una stringa. In questo esempio il tipo di prodotto deve essere "elettronica", "libri" o "video".
SELECT *
FROM purchase_table
WHERE product_type LIKE ANY ('electronics', 'books', 'video');
Abbina tutto (deve soddisfare tutti i requisiti).
In questo esempio, sia "regno unito" che "londra" e "strada orientale" (comprese le varianti) devono essere abbinati.
SELECT *
FROM customer_table
WHERE full_address LIKE ALL ('%united kingdom%', '%london%', '%eastern road%');
Selezione negativa:
Usa TUTTO per escludere tutti gli elementi.
Questo esempio produce tutti i risultati in cui il tipo di prodotto non è "elettronica" e non "libri" e non "video".
SELECT *
FROM customer_table
WHERE product_type NOT LIKE ALL ('electronics', 'books', 'video');
Cerca un intervallo di caratteri
La seguente istruzione corrisponde a tutti i record con FName che inizia con una lettera da A a F dalla tabella dei dipendenti .
SELECT * FROM Employees WHERE FName LIKE '[A-F]%'
Istruzione ESCAPE nella query LIKE
Se implementi una ricerca di testo come LIKE
-query, di solito lo fai in questo modo:
SELECT *
FROM T_Whatever
WHERE SomeField LIKE CONCAT('%', @in_SearchText, '%')
Tuttavia, (a parte il fatto che non si dovrebbe utilizzare necessariamente LIKE
quando è possibile utilizzare la ricerca fulltext), ciò crea un problema quando qualcuno inserisce un testo come "50%" o "a_b".
Quindi (invece di passare alla ricerca fulltext), puoi risolvere il problema usando l'istruzione LIKE
-escape:
SELECT *
FROM T_Whatever
WHERE SomeField LIKE CONCAT('%', @in_SearchText, '%') ESCAPE '\'
Ciò significa che \
ora verrà trattato come carattere ESCAPE. Ciò significa, è ora possibile solo anteporre \
ad ogni carattere della stringa si cerca, ed i risultati inizieranno a essere corretti, anche quando l'utente inserisce un carattere speciale come %
o _
.
per esempio
string stringToSearch = "abc_def 50%";
string newString = "";
foreach(char c in stringToSearch)
newString += @"\" + c;
sqlCmd.Parameters.Add("@in_SearchText", newString);
// instead of sqlCmd.Parameters.Add("@in_SearchText", stringToSearch);
Nota: l'algoritmo di cui sopra è solo a scopo dimostrativo. Non funzionerà nei casi in cui 1 grafema è composto da più caratteri (utf-8). eg string stringToSearch = "Les Mise\u0301rables";
Dovrai farlo per ogni grafema, non per ogni personaggio. Non si dovrebbe usare l'algoritmo di cui sopra se si ha a che fare con lingue asiatiche / est-asiatiche / sud-asiatiche. O meglio, se vuoi che il codice corretto abbia inizio, dovresti farlo per ogni graphemeCluster.
Vedi anche ReverseString, una domanda-intervista in C #
Caratteri jolly
i caratteri jolly vengono utilizzati con l'operatore SQL LIKE. I caratteri jolly SQL vengono utilizzati per cercare dati all'interno di una tabella.
I caratteri jolly in SQL sono:%, _, [charlist], [^ charlist]
% - Un sostituto per zero o più caratteri
Eg: //selects all customers with a City starting with "Lo"
SELECT * FROM Customers
WHERE City LIKE 'Lo%';
//selects all customers with a City containing the pattern "es"
SELECT * FROM Customers
WHERE City LIKE '%es%';
_ - Un sostituto per un singolo personaggio
Eg://selects all customers with a City starting with any character, followed by "erlin"
SELECT * FROM Customers
WHERE City LIKE '_erlin';
[charlist] - Set e intervalli di caratteri da abbinare
Eg://selects all customers with a City starting with "a", "d", or "l"
SELECT * FROM Customers
WHERE City LIKE '[adl]%';
//selects all customers with a City starting with "a", "d", or "l"
SELECT * FROM Customers
WHERE City LIKE '[a-c]%';
[^ charlist] - Corrisponde solo a un carattere NON specificato tra parentesi
Eg://selects all customers with a City starting with a character that is not "a", "p", or "l"
SELECT * FROM Customers
WHERE City LIKE '[^apl]%';
or
SELECT * FROM Customers
WHERE City NOT LIKE '[apl]%' and city like '_%';