Czy jest StartsWith lub Contains w t sql ze zmiennymi?


94

Próbuję wykryć, czy na serwerze działa wersja Express Edition.

Mam następujący t sql.

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

print @edition

W moim przypadku @edition = Express Edition (64-bit)

Jak mogę wykonać następujące czynności? (Inspirowane C #).

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

Odpowiedzi:


123

Zaczynać z

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

Zawiera

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

Przykłady

left funkcjonować

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

iif funkcja (począwszy od SQL Server 2012)

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

charindex funkcjonować

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

1
Zwróć uwagę, że wewnętrznie działają one inaczej, szczególnie w przypadku wydajności WRT i korzystania z indeksów. Na przykład zapytanie używające colName LIKE 'prefix%'będzie bardzo szybkie po colNameindeksowaniu, ale colName LIKE '%substring%'lub colName LIKE '%suffix'będzie wolne, ponieważ SQL Server nie tworzy drzew sufiksów podczas indeksowania tekstu. Podobnie używanie LEFTz kolumną będzie również powolne, ponieważ te zapytania nie są SARGable. SARGability jest ważna: dba.stackexchange.com/questions/162263/…
Dai

Poleciłbym przetestować metodę LIKE „x%” wspomnianą poniżej. W niektórych przypadkach jest znacznie szybciej
Tony Sepia

72

Wygląda na to, że chcesz http://msdn.microsoft.com/en-us/library/ms186323.aspx .

W twoim przykładzie byłoby to (zaczyna się od):

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

Albo zawiera

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

Dlaczego nie skorzystać z LIKE Express Edition%? Ponadto, czy Twoje rozwiązanie nie zwraca prawdy, czy „Express Edition” jest w dowolnym miejscu w ciągu? Jest to więc bardziej konkretny sposób na zrobienie tego w stylu „zawiera”
Don Cheadle,

3
@mmcrae Podczas korzystania z podobnej wersji poniżej byłoby w porządku, był to pierwszy sposób, który przyszedł do głowy i wygląda najbardziej jak to, co miał OP. Ponadto pierwsze wyrażenie zwróci wartość true tylko wtedy, gdy zmienna zaczyna się od (charindex zwraca 1) podanego argumentu. Drugie wyrażenie to zawiera, ponieważ zwróci wartość true, jeśli argument zostanie znaleziony w dowolnym miejscu ciągu (charindex zwraca 1 lub więcej).
Gary.S

46

użyłbym

like 'Express Edition%'

Przykład:

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

Jeśli czytasz pytanie, nie jest to zapytanie. Wypróbuj mój przykład ze swoją odpowiedzią, a następnie zaktualizuj swoją odpowiedź, pokazując, że działa.
Valamas

Możesz używać podobnie jak w instrukcjach if w t-sql. Dlatego używam like. Nie rozumiem, dlaczego chcesz dać mi za to punkty minus, ale dlaczego nie.
Thomas Koelle

9
Powinien to być preferowany sposób; jest bardziej elegancki, mniej rozwlekły i „wyrównany do SQL”: ponieważ używa standardowego operatora SQL LIKE, nie powinienem czytać dokumentacji, aby to zrozumieć!
Fer García
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.