Porównywanie ciągów znaków rozróżniających wielkość liter SQL

234

Jak porównywać ciągi, aby porównanie było prawdziwe tylko wtedy, gdy przypadki każdego z ciągów również są równe. Na przykład:

Select * from a_table where attribute = 'k'

... zwróci wiersz z atrybutem „K”. Nie chcę tego zachowania.

amccormack
źródło
Może to nie być to, czego potrzebujesz, ale możesz zmienić sortowanie lub użyć określonego sortowania w zapytaniu.
Kane
7
Który produkt SQL?
poniedziałek

Odpowiedzi:

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

Wykonał lewę.

amccormack
źródło
4
Zwykle użyłbym Latin1_General_Bin
gbn
3
Tak, standardowe podejście polega na zastosowaniu sortowania bez rozróżniania wielkości liter, chociaż same sortowania są specyficzne dla dostawcy. Czy Twoja składnia SQL Server?
poniedziałek
W moim przypadku mam 1 kolumnę w db, która rozróżnia wielkość liter. Musiałem porównać to ze standardową kolumną (CI). Użyłem odmiany tego GDZIE Foo.Bar = (Baz.Bar COLLATE Latin1_General_CS_AS)
Hypnovirus
2
Dzięki, ale co to jest Latin1_General_CS_AS? Czy to specjalne słowo kluczowe?
Vijay Singh Rana
2
@VijaySinghRana Latin1_General_CS_ASto specyfikacja sortowania. Sortowanie odnosi się do zestawu reguł, które określają sposób sortowania i porównywania danych. Zobacz tę stronę, aby uzyskać więcej informacji.
amccormack
51

Możesz również przekonwertować ten atrybut na wielkość liter, używając następującej składni:

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

Teraz w wyszukiwaniu rozróżniana jest wielkość liter .

Jeśli chcesz ponownie rozróżnić wielkość liter w tej kolumnie , użyj

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CI_AS
Jugal
źródło
29

Możesz łatwo przekonwertować kolumny na VARBINARY (maksymalna długość), długość musi być wartością maksymalną, jakiej można się spodziewać, aby uniknąć wadliwego porównania, wystarczy ustawić długość jako długość kolumny. Przytnij kolumnę pomaga porównać rzeczywistą wartość, z wyjątkiem tego, że spacja ma znaczenie i jest wyceniana w kolumnach tabeli. To prosta próbka. Jak widać I Przytnij wartość kolumny, a następnie przekonwertuj i porównaj:

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

Mam nadzieję, że to pomoże.

QMaster
źródło
2
dokładnie to, czego szukałem. Prosty sposób na jednorazowe porównanie z rozróżnianiem wielkości liter w celu znalezienia pozycji zawierających wielkie litery.
Mike D.,
20

Jako kolejną alternatywę możesz użyć HASHBYTES, coś takiego:

SELECT * 
FROM a_table 
WHERE HASHBYTES('sha1', attribute) = HASHBYTES('sha1', 'k')
Dave Sexton
źródło
1
Co z kolizjami? Byłoby to rzadkie, ale zakładam, że istnieje wiele ciągów, które mają tę samą wartość.
David Klempfner,
Tak, możliwe, ale niezwykle rzadkie na tak prostym przykładzie strun, jakie bym pomyślał.
Dave Sexton,
@DavidKlempfner, dlaczego nie najpierw porównać, a jeśli pasują, sprawdź także hashbytes? Możemy uczynić tę funkcję i wywołać ją jak StringsAreCaseSensitiveEqual (a, b) => a = b AND HASHBYTES ('sha1', a) = HASHBYTES ('sha1', b)
Demetris Leptos
3

Możesz zdefiniować attributejako, BINARYużyć INSTRlub, STRCMPaby przeprowadzić wyszukiwanie.

MatTheCat
źródło
Wydaje się, że ta odpowiedź nie dotyczy SQL Servera według tagu pytania. Że DBMS nie ma tych INSTRi STRCMPfunkcji.
Jonas,