SQL: ignora il caso durante la ricerca di una stringa


130


Ho i seguenti dati in una tabella
PriceOrderShipped
PriceOrderShippedInbound
PriceOrderShippedOutbound

In SQL ho bisogno di scrivere una query che cerca una stringa in una tabella. Durante la ricerca di una stringa dovrebbe ignorare il caso. Per la query SQL di seguito indicata

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%PriceOrder%' 

fornisce tutti i dati di cui sopra, mentre

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%Priceorder%' 

non dà.

Per esempio. quando cerco "PriceOrder" o "priceOrder" funziona ma "priceorder" o "Priceorder" non funzionano. Ho provato con la query seguente usando COLLATE, ma non funziona. Fammi sapere dove sto andando storto.

SELECT DISTINCT COL_NAME FROM myTable WHERE 
COL_NAME COLLATE latin1_general_cs LIKE '%Priceorder%'

Risposte:


232

Usa qualcosa del genere -

SELECT DISTINCT COL_NAME FROM myTable WHERE UPPER(COL_NAME) LIKE UPPER('%PriceOrder%')

o

SELECT DISTINCT COL_NAME FROM myTable WHERE LOWER(COL_NAME) LIKE LOWER('%PriceOrder%')

14
Penso che dovresti sempre confrontare le stringhe in maiuscolo (UPPER) come best practice. Google "turkish i"
Traubenfuchs,

2
Ti piacerebbe sapere se la tua risposta ha qualche problema di prestazioni convertendo un valore di colonna in un caso UPPERo LOWERpoi usando la LIKEricerca?
shaijut,

In realtà dovresti confrontare entrambe le varianti UPPER e LOWER perché alcuni caratteri hanno rappresentazioni diverse in maiuscolo ma la stessa rappresentazione in minuscolo. Per altri personaggi, potrebbe essere vero il contrario. Java menziona l'alfabeto georgiano specificamente come motivo per fare un ulteriore toLowerCase () nel suo confronto senza distinzione tra maiuscole e minuscole.
Crusha K. Rool

1
Sfortunatamente, questo approccio provoca una scansione completa della tabella come descritto in questo post: alvinalexander.com/sql/… . Non è possibile applicare una ricerca indice, poiché la colonna filtrata viene modificata dalla funzione UPPER / LOWER.
Jeff S.

L'impostazione di un confronto (prima di creare l'indice) sembra essere l'approccio migliore se le prestazioni della query con superiore / inferiore non sono sufficienti.
Jeff S.

10

Vedi questa domanda simile e rispondi alla ricerca con insensibilità al maiuscolo - il server SQL ignora il caso in un'espressione where

Prova a usare qualcosa come:

SELECT DISTINCT COL_NAME 
FROM myTable 
WHERE COL_NAME COLLATE SQL_Latin1_General_CP1_CI_AS LIKE '%priceorder%'

non funziona. Ottengo la query SQL non terminata correttamente prima di Collate
shockwave,

@ Miguel-F .. funziona benissimo, ma in cosa differisce da SELEZIONA DISTINCT COL_NAME DA myTable DOVE COL_NAME MI PIACE '% priceorder%' perché anche questo funziona bene per me ..
Jishant,

Consiglierei invece di utilizzare "SQL_Latin1_General_Cp1_CI_AS_KI_WI". Non è sensibile al maiuscolo / minuscolo per una ricerca.
user8155123

8

Come questo.

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME iLIKE '%Priceorder%'

In postgresql.


4
Questa domanda è taggata sql-server quindi una risposta postgres non è rilevante.
Liam,

4

Probabilmente dovresti usare SQL_Latin1_General_Cp1_CI_AS_KI_WIcome collation. Quello specificato nella domanda fa distinzione tra maiuscole e minuscole.

Puoi vedere un elenco di regole di confronto qui .

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.