2013-08-08 20 views
13

すべて、大文字小文字のテスト - T-Sql

T-SQLでは、指定されたvarchar文字または文字列全体が大文字であるかどうかを確認するにはどうすればよいですか?理想的には、文字が大文字であるかどうかをテストするための関数を書いておき、後でそれを汎用のvarcharに適用することができます。アルファベット以外の文字に対してはfalseを返します。私は英語の文字だけに興味があります。

私は、SQL Management StudioでT-SQLで働いている、と私はこの方法でテーブルから小文字で始まるレコードを引っ張って試してみました:0のレコードを返します

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

を、私は知っています大文字と小文字で始まるレコードがあります。

おかげ


EDIT:照会するために使用するための最も効率的な方法であると思われるpodiluskajoachim-isaksoonの両方が、(どちらの方法は、私の目的のために働く)私の質問に、正常に答えている誰かの心は説明するであろうから大文字で始まる、または大文字で始まらない著者とのレコードを除外するための多数のレコードを持つテーブル?照合

例えば使用

+1

"非英字"の言語ですか? 'Π'の真偽を返しますか? (大文字 'π') –

+0

マーティンありがとう、私は私の質問を改善しました。私はそれが非英語のアルファベット文字のために何を返すか気にしない。 – Danzomida

+2

EDITパートへの回答:これは無関係である必要があります。両方のクエリが同じように動作するはずです。どちらの場合でも、テーブル全体をスキャンし、各行の 'author'の値を取得する必要があります。これはクエリ時間の99%を要します。 'LOWER()'、 'UNICODE()'のような関数は意味がないので、意味がありません。どちらを選んでも違いはありません。それでも、あなたの実際のデータで両方のクエリをテストし、どちらかがうまく機能するかどうかを確認することをお勧めします。 –

答えて

23

:照合名に

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は大文字と小文字を区別(CIと、大文字と小文字を区別しない)を示しています。 AI/ASは、アクセントの感度に関連しています。

またはあなたの例では

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

chは大文字で、かつ非アルファベットを除く上下のケース(すなわち間で変換することができます文字であるかどうかを確認するには

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

のようなもの文字);

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

An SQLfiddle to test with;

+0

それはうまくいくでしょうが、文字列全体を比較すると痛みになります:) – podiluska

+0

@podiluska実際、文字列全体をどうにかするのかどうかは明らかではありません。 –