변수가있는 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 %'방법을 테스트하는 것이 좋습니다. 어떤 경우에는 훨씬 빠릅니다
Tony Sepia

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를 반환합니다. 두 번째 표현식은 문자열에서 인수가 발견되면 true를 리턴하므로 포함입니다 (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 문 에서처럼 사용할 수 있습니다. 이것이 내가 좋아하는 이유입니다. 왜 저에게 마이너스 포인트를 주려고하는지 모르겠지만 왜 안하는지 모르겠습니다.
토마스 Koelle

9
이것이 선호되는 방법이어야합니다. 더 우아하고, 덜 장황하며, "SQL 정렬"입니다. 표준 SQL LIKE 연산자를 사용하므로 이해하기 위해 문서를 읽을 필요가 없습니다!
Fer García
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.