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.