Apakah ada StartsWith atau Contains di t sql dengan variabel?

94

Saya mencoba mendeteksi apakah server menjalankan Edisi Ekspres.

Saya memiliki sql t berikut.

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

print @edition

Dalam contoh saya, @edition = Express Edition (64-bit)

Bagaimana saya bisa melakukan hal berikut? (C # terinspirasi).

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

Jawaban:

122

Dimulai dengan

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

Mengandung

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

Contoh

left fungsi

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

iif fungsi (dimulai dengan SQL Server 2012)

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

charindex fungsi

set @isExpress = iif(charindex('Express Edition', @edition) = 1, 1, 0);
Kirill Polishchuk
sumber
1
Perhatikan bahwa secara internal ini bekerja secara berbeda, terutama kinerja wrt dan penggunaan indeksnya. Misalnya, kueri yang digunakan colName LIKE 'prefix%'akan sangat cepat saat colNamediindeks, tetapi colName LIKE '%substring%'atau colName LIKE '%suffix'akan menjadi lambat karena SQL Server tidak membuat pohon sufiks saat mengindeks teks. Demikian pula penggunaan LEFTdengan kolom juga akan lambat karena kueri tersebut bukan SARGable. SARGability itu penting: dba.stackexchange.com/questions/162263/…
Dai
Saya akan merekomendasikan untuk menguji metode LIKE 'x%' yang disebutkan di bawah ini. Dalam beberapa kasus, ini jauh lebih cepat
Tony Sepia
72

Sepertinya yang Anda inginkan adalah http://msdn.microsoft.com/en-us/library/ms186323.aspx .

Dalam contoh Anda, ini akan menjadi (dimulai dengan):

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

Atau berisi

set @isExpress = (CharIndex('Express Edition', @edition) >= 1)
Gary.S
sumber
Mengapa tidak menggunakan LIKE Express Edition%? Juga, bukankah solusi Anda mengembalikan true dari "Edisi Ekspres" ada di mana pun dalam string? Jadi, ini lebih khusus lagi hanya semacam "Berisi" cara melakukannya
Don Cheadle
3
@mmcrae Meskipun menggunakan versi seperti di bawah ini akan baik-baik saja, ini adalah cara pertama yang terlintas dalam pikiran dan paling terlihat seperti yang dimiliki OP. Juga, ekspresi pertama hanya akan mengembalikan nilai true jika variabel diawali dengan (charindex mengembalikan 1) argumen yang diberikan. Ekspresi kedua adalah berisi karena akan mengembalikan true jika argumen ditemukan di mana saja dalam string (charindex mengembalikan 1 atau lebih besar).
Gary.S
45

Saya akan menggunakan

like 'Express Edition%'

Contoh:

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
Thomas Koelle
sumber
Jika Anda membaca pertanyaannya, itu bukan pertanyaan. Coba contoh saya dengan jawaban Anda dan kemudian perbarui jawaban Anda yang menunjukkan bahwa itu berfungsi.
Valamas
Anda dapat menggunakan seperti di if-statement di t-sql. Inilah mengapa saya menggunakan like. Saya tidak mengerti mengapa Anda ingin memberi saya poin minus untuk itu tetapi mengapa tidak.
Thomas Koelle
9
Ini harus menjadi cara yang disukai; lebih elegan, kurang bertele-tele dan "SQL aligned": karena menggunakan operator standar seperti SQL, saya tidak perlu membaca dokumentasi untuk memahaminya!
Fer García