Existe StartsWith ou Contains em t sql com variáveis?

94

Estou tentando detectar se o servidor está executando o Express Edition.

Eu tenho o seguinte t sql.

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

print @edition

No meu caso, @edition = Express Edition (64-bit)

Como posso fazer o seguinte? (Inspirado em C #).

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

Respostas:

122

Começa com

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

Contém

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

Exemplos

left função

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

iif função (começando com SQL Server 2012)

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

charindex função

set @isExpress = iif(charindex('Express Edition', @edition) = 1, 1, 0);
Kirill Polishchuk
fonte
1
Observe que internamente eles funcionam de maneira diferente, especialmente o desempenho de wrt e seu uso de índices. Por exemplo, uma consulta usando colName LIKE 'prefix%'será muito rápida quando colNamefor indexada, mas colName LIKE '%substring%'ou colName LIKE '%suffix'será lenta porque o SQL Server não cria árvores de sufixo ao indexar texto. Da mesma forma, o uso LEFTcom uma coluna também será lento porque essas consultas não são SARGable. SARGability é importante: dba.stackexchange.com/questions/162263/…
Dai
Eu recomendaria testar o método LIKE 'x%' mencionado abaixo. Em alguns casos, é muito mais rápido
Tony Sepia
72

Parece que o que você quer é http://msdn.microsoft.com/en-us/library/ms186323.aspx .

No seu exemplo, seria (começa com):

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

Ou contém

set @isExpress = (CharIndex('Express Edition', @edition) >= 1)
Gary.S
fonte
Por que não usar o LIKE Express Edition%? Além disso, sua solução não retorna verdadeiro, pois "Express Edition" está em qualquer lugar da string? Portanto, é mais especificamente uma forma de fazer "contém"
Don Cheadle
3
@mmcrae Embora usar a versão semelhante a seguir seja bom, esta foi a primeira maneira que veio à mente e se parece mais com o que o OP tinha. Além disso, a primeira expressão só retornará true se a variável começar com (charindex retorna 1) o argumento fornecido. A segunda expressão é contém, pois retornará verdadeiro se o argumento for encontrado em qualquer lugar da string (charindex retorna 1 ou maior).
Gary.S
45

eu usaria

like 'Express Edition%'

Exemplo:

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
Thomas Koelle
fonte
Se você leu a pergunta, não é uma consulta. Tente meu exemplo com sua resposta e, em seguida, atualize sua resposta mostrando que funciona.
Valamas
Você pode usar como em instruções if em t-sql. É por isso que eu uso like. Não vejo por que você quer me dar pontos negativos para isso, mas por que não.
Thomas Koelle,
9
Esta deve ser a forma preferida; é mais elegante, menos prolixo e "alinhado com SQL": como usa o operador SQL LIKE padrão, não preciso ler a documentação para entendê-lo!
Fer García