Чи існує в 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

Починається з

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зі стовпцем також буде повільним, оскільки ці запити не є SARGable. Важливість SARGibility: dba.stackexchange.com/questions/162263/…
Dai

Я б порекомендував протестувати спосіб, подібний до '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. Крім того, перший вираз поверне true, лише якщо змінна починається з (charindex повертає 1) заданого аргументу. Другий вираз є a містить, оскільки він поверне true, якщо аргумент знайдено де-небудь у рядку (charindex повертає 1 або більше).
Гері.

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

Якщо ви прочитали питання, це не запит. Спробуйте мій приклад із вашою відповіддю, а потім, будь ласка, оновіть свою відповідь, показуючи, що вона працює.
Валамас

Ви можете використовувати як у if-statement у t-sql. Ось чому я використовую like. Я не розумію, чому ви хочете мені за це дати мінус-бали, але чому ні.
Thomas Koelle,

9
Це повинен бути кращий спосіб; він більш елегантний, менш багатослівний і "вирівняний за SQL": оскільки він використовує стандартний оператор SQL LIKE, мені не потрібно читати документацію, щоб зрозуміти це!
Фер Гарсія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.