변수가있는 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.