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 '_%';


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow