2013-08-08 29 views
13

wszystkimTest wielkimi literami - T-SQL

Jak mogę sprawdzić, czy określony znak varchar lub cały ciąg jest wielkimi literami w T-SQL? Idealnie chciałbym napisać funkcję, która sprawdzi, czy postać jest duża, a następnie mogę ją zastosować do generycznego varchara. Powinien zwrócić wartość false w przypadku znaków niefazowych. Interesują mnie tylko postacie w języku angielskim.

Pracuję z T-SQL w SQL Management Studio, a ja próbowałem ciągnąc rekordy zaczynające się od liter? Z tabeli w ten sposób:

select * from TABLE 
where SUBSTRING(author,1,1) != LOWER(SUBSTRING(author,1,1)) 

Które zwraca 0 rekordów, ale wiem, istnieją zapisy zaczynające się od wielkich i małych liter.

Dzięki


EDIT: Ponieważ zarówno podiluska i joachim-isaksoon pomyślnie odpowiedział na moje pytanie (obie metody działają do moich celów), czy ktoś myśli tłumacząc, która byłaby najbardziej skuteczna metoda w użyciu kwerendy tabelę z dużą liczbą rekordów, aby odfiltrować rekordy z autorami zaczynającymi się od dużej litery lub bez?

+1

"Znaki nieelegatywne" w jakim języku? Czy zwróci true lub false na 'Π'? (wielkie litery 'π') –

+0

Dzięki Martin, poprawiłem moje pytanie. Nie mam nic przeciwko temu, co zwraca dla znaków alfabetu angielskiego. – Danzomida

+2

Odpowiedź na edycję części: nie powinno to mieć znaczenia, oba zapytania powinny wykonać to samo. Tak czy inaczej, musisz przeskanować całą tabelę i pobrać wartość "autor" dla każdego wiersza - a to zajmuje 99% czasu zapytania. Funkcje takie jak 'LOWER()', 'UNICODE()' są bezsensowne pod względem wydajności i niezależnie od tego, co wybierzesz, nie powinno to mieć znaczenia. Powiedziawszy to, nadal sugeruję, abyś przetestował oba zapytania na faktycznych danych i sprawdził, czy działa lepiej. –

Odpowiedz

23

Korzystanie sortowania

np

if ('a'='A' Collate Latin1_General_CI_AI) 
    print'same 1' 
else 
    print 'different 1' 

if ('a'='A' Collate Latin1_General_CS_AI) 
    print'same 2' 
else 
    print 'different 2' 

CS w imię sortowania wskazuje Case Sensitive (i CI, wielkość liter ma znaczenie). AI/AS odnosi się do czułości akcentu.

lub w przykładzie

SUBSTRING(author,1,1) <> LOWER(SUBSTRING(author,1,1)) COLLATE Latin1_General_CS_AI 
1

coś

declare @v varchar(10) = 'ABC', @ret int = 0 
select @ret = 1 where upper(@v)[email protected] COLLATE SQL_Latin1_General_CP1_CS_AS 
select @ret 
10

aby sprawdzić, czy ch jest wielkimi literami, a to znak, że można przekształcić pomiędzy dużymi i małymi literami (czyli z wyłączeniem non alfabetycznym postacie);

WHERE UNICODE(ch) <> UNICODE(LOWER(ch)) 

An SQLfiddle to test with;

+0

To zadziała, ale porównanie całego ciągu będzie uciążliwe :) – podiluska

+0

@podiluska Rzeczywiście, ale nie bardzo wiadomo, co zrobić z całymi ciągami znaków _contain_ symboli, więc postanowiłem rozwiązać ograniczony problem :) –

Powiązane problemy