Confronto stringhe maiuscole / minuscole SQL


234

Come si confrontano le stringhe in modo che il confronto sia vero solo se anche i casi di ciascuna stringa sono uguali. Per esempio:

Select * from a_table where attribute = 'k'

... restituirà una riga con un attributo di "K". Non voglio questo comportamento.


Potrebbe non essere quello di cui hai bisogno, ma puoi cambiare il Collation o utilizzare un Collation specifico nella tua query.
Kane,

7
Quale prodotto SQL?
onedayquando il

Risposte:


388
Select * from a_table where attribute = 'k' COLLATE Latin1_General_CS_AS 

Ha fatto il trucco.


4
Normalmente userei Latin1_General_Bin
gbn

3
Sì, l'approccio standard prevede l'utilizzo di regole di confronto senza distinzione tra maiuscole e minuscole, sebbene le regole di confronto stesse siano specifiche del fornitore. La tua sintassi di SQL Server?
onedayquando il

Nel mio caso, ho 1 colonna nel mio db che fa distinzione tra maiuscole e minuscole. Ho dovuto confrontarlo con una colonna standard (CI). Ho usato una variante di questo WHERE Foo.Bar = (Baz.Bar COLLATE Latin1_General_CS_AS)
Hypnovirus

2
Grazie, ma cos'è Latin1_General_CS_AS ?? È una parola chiave speciale?
Vijay Singh Rana,

2
@VijaySinghRana Latin1_General_CS_ASè una specifica delle regole di confronto. Le regole di confronto si riferiscono a un insieme di regole che determinano il modo in cui i dati vengono ordinati e confrontati. Vedi questa pagina per maggiori informazioni.
amccormack

51

Puoi anche convertire quell'attributo come case sensitive usando questa sintassi:

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CS_AS

Ora la tua ricerca farà distinzione tra maiuscole e minuscole .

Se si desidera rendere di nuovo insensibile quella colonna , utilizzare

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CI_AS

29

Puoi facilmente convertire le colonne in VARBINARY (Lunghezza massima), La lunghezza deve essere la massima che ti aspetti per evitare un confronto difettoso, È sufficiente impostare la lunghezza come lunghezza della colonna. La colonna Trim ti aiuta a confrontare il valore reale tranne che lo spazio ha un significato e valorizzato nelle colonne della tabella, Questo è un semplice esempio e come puoi vedere I Taglia il valore delle colonne e poi converti e confronta .:

CONVERT(VARBINARY(250),LTRIM(RTRIM(Column1))) = CONVERT(VARBINARY(250),LTRIM(RTRIM(Column2)))

Spero che questo aiuto.


2
esattamente quello che stavo cercando. Un modo semplice per eseguire un confronto singolo, con distinzione tra maiuscole e minuscole per trovare voci che contengono caratteri maiuscoli.
Mike D.

20

Proprio come un'altra alternativa potresti usare HASHBYTES, qualcosa del genere:

SELECT * 
FROM a_table 
WHERE HASHBYTES('sha1', attribute) = HASHBYTES('sha1', 'k')

1
E le collisioni? Sarebbe raro ma suppongo che ci sarebbero più stringhe che hanno lo stesso valore.
David Klempfner,

Sì, ma estremamente raro su un esempio di stringa così semplice avrei pensato.
Dave Sexton,

@DavidKlempfner perché non fare prima il confronto e se corrispondono poi controlla anche gli hashbyte? Potremmo rendere questa una funzione e invocarla come StringsAreCaseSensitiveEqual (a, b) => a = b AND HASHBYTES ('sha1', a) = HASHBYTES ('sha1', b)
Demetris Leptos

3

È possibile definire attributecome BINARYo utilizzare INSTRo STRCMPper eseguire la ricerca.


Questa risposta non sembra riguardare SQL Server per il tag della domanda. Quel DBMS manca di questi INSTRe STRCMPfunzioni.
Jonas il
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.