変数付きのt sqlにStartsWithまたはContainsはありますか?


94

サーバーがExpress Editionを実行しているかどうかを検出しようとしています。

次のt sqlがあります。

DECLARE @edition varchar(50); 
set @edition = cast((select SERVERPROPERTY ('edition')) as varchar)

print @edition

私の場合、 @edition = Express Edition (64-bit)

次の方法を教えてください。(C#に触発された)。

DECLARE @isExpress bit;
set @isExpress = @edition.StartsWith('Express Edition');

回答:


122

StartsWith

a) left(@edition, 15) = 'Express Edition'
b) charindex('Express Edition', @edition) = 1

含む

charindex('Express Edition', @edition) >= 1

left 関数

set @isExpress = case when left(@edition, 15) = 'Express Edition' then 1 else 0 end

iif 関数(SQL Server 2012以降)

set @isExpress = iif(left(@edition, 15) = 'Express Edition', 1, 0);

charindex 関数

set @isExpress = iif(charindex('Express Edition', @edition) = 1, 1, 0);

1
内部的にはこれらの動作が異なり、特にwrtパフォーマンスとそのインデックスの使用に注意してください。例えば、使用するクエリは、 colName LIKE 'prefix%'ときに、非常に高速になりますcolNameインデックス化されていますが、colName LIKE '%substring%'またはcolName LIKE '%suffix'テキストのインデックスを作成する際に、SQL Serverは接尾辞木を作成していないため、遅くなります。同様にLEFT、これらのクエリはSARG可能ではないため、列での使用も遅くなります。SARGabilityは重要です:dba.stackexchange.com/questions/162263/...

下記のLIKE 'x%'メソッドをテストすることをお勧めします。場合によってははるかに高速です
トニーセピア

72

必要なのはhttp://msdn.microsoft.com/en-us/library/ms186323.aspxのようです。

あなたの例ではそれは(で始まる):

set @isExpress = (CharIndex('Express Edition', @edition) = 1)

または含む

set @isExpress = (CharIndex('Express Edition', @edition) >= 1)

LIKEを使用しないのはなぜExpress Edition%ですか?また、あなたのソリューションは「Express Edition」が文字列のどこかにtrueを返しませんか?つまり、具体的には、「含む」のような方法です
Don Cheadle

3
@mmcrae以下のようなバージョンを使用しても問題ありませんが、これは最初に思いついた方法であり、OPが持っていたものに最も似ています。また、最初の式は、変数が指定された引数で始まる(charindexが1を返す)場合にのみtrueを返します。2番目の式は、引数が文字列のどこかに見つかった場合にtrueを返すため、containsです(charindexは1以上を返します)。
Gary.S

45

私は使うだろう

like 'Express Edition%'

例:

DECLARE @edition varchar(50); 
set @edition = cast((select SERVERPROPERTY ('edition')) as varchar)

DECLARE @isExpress bit
if @edition like 'Express Edition%'
    set @isExpress = 1;
else
    set @isExpress = 0;

print @isExpress

質問を読んだ場合、それはクエリではありません。私の例をあなたの答えで試してから、それが機能することを示してあなたの答えを更新してください。
Valamas

t-sqlのifステートメントでlikeを使用できます。これが私が好きな理由です。なぜあなたは私にマイナスポイントを与えたいのか分かりませんが、なぜそうしないのですか。
Thomas Koelle、2015

9
これは推奨される方法です。よりエレガントで、冗長性が低く、「SQLに合わせて」います。標準のSQL LIKE演算子を使用しているため、ドキュメントを読んで理解する必要はありません。
フェルガルシア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.