Есть ли в 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');
Валамас
источник

Ответы:

123

Начинается с

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
Обратите внимание, что внутри они работают по-разному, особенно в отношении производительности и использования индексов. Например, использование запроса colName LIKE 'prefix%'будет очень быстрым при colNameиндексировании, но colName LIKE '%substring%'или colName LIKE '%suffix'будет медленным, потому что SQL Server не создает суффикс-деревья при индексировании текста. Аналогичным образом использование LEFTсо столбцом также будет медленным, потому что эти запросы не поддерживают поиск по запросу. 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" находится где-нибудь в строке? Так что это, более конкретно, способ сделать это просто "Содержит"
Дон Чидл
3
@mmcrae Хотя использование подобной версии ниже было бы хорошо, это был первый способ, который пришел в голову и больше всего похож на то, что было у OP. Кроме того, первое выражение вернет истину, только если переменная начинается с (charindex возвращает 1) заданного аргумента. Второе выражение - это содержит, поскольку оно вернет истину, если аргумент найден где-нибудь в строке (charindex возвращает 1 или больше).
Gary.S
46

я хотел бы использовать

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
Вы можете использовать как в операторах if в t-sql. Вот почему я использую лайк. Не понимаю, почему вы хотите дать мне за это минус, но почему бы и нет.
Thomas Koelle
9
Это должен быть предпочтительный способ; он более элегантен, менее подробен и «выровнен по SQL»: поскольку он использует стандартный оператор SQL LIKE, мне не нужно читать документацию, чтобы понять его!
Фер Гарсия