Y a-t-il StartsWith ou Contains dans t sql avec des variables?

94

J'essaie de détecter si le serveur exécute Express Edition.

J'ai le t sql suivant.

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

print @edition

Dans mon cas, @edition = Express Edition (64-bit)

Comment puis-je faire ce qui suit? (Inspiré C #).

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

Réponses:

122

Commence avec

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

Contient

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

Exemples

left fonction

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

iif fonction (à partir de SQL Server 2012)

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

charindex fonction

set @isExpress = iif(charindex('Express Edition', @edition) = 1, 1, 0);
Kirill Polishchuk
la source
1
Notez qu'en interne, ceux-ci fonctionnent différemment, en particulier les performances de l'écriture et son utilisation des index. Par exemple, une requête utilisant colName LIKE 'prefix%'sera très rapide lorsqu'elle colNameest indexée, mais colName LIKE '%substring%'ou colName LIKE '%suffix'sera lente car SQL Server ne crée pas d'arborescence de suffixes lors de l'indexation de texte. De même, l'utilisation LEFTavec une colonne sera également lente car ces requêtes ne sont pas SARGable. SARGability is important: dba.stackexchange.com/questions/162263/…
Dai
Je recommanderais de tester la méthode LIKE 'x%' mentionnée ci-dessous. Dans certains cas, c'est beaucoup plus rapide
Tony Sepia
72

Il semble que ce que vous voulez soit http://msdn.microsoft.com/en-us/library/ms186323.aspx .

Dans votre exemple, ce serait (commence par):

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

Ou contient

set @isExpress = (CharIndex('Express Edition', @edition) >= 1)
Gary.S
la source
Pourquoi ne pas utiliser LIKE Express Edition%? De plus, votre solution ne renvoie-t-elle pas la valeur "Express Edition" n'importe où dans la chaîne? Donc, c'est plus précisément une sorte de façon de faire "Contient"
Don Cheadle
3
@mmcrae Bien que l'utilisation de la version similaire ci-dessous convienne, c'était la première façon qui m'est venue à l'esprit et qui ressemble le plus à ce que l'OP avait. De plus, la première expression ne retournera true que si la variable commence par (charindex renvoie 1) l'argument donné. La deuxième expression est un contient car elle retournera true si l'argument se trouve n'importe où dans la chaîne (charindex renvoie 1 ou plus).
Gary.S
45

j'utiliserais

like 'Express Edition%'

Exemple:

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
la source
Si vous lisez la question, ce n'est pas une requête. Essayez mon exemple avec votre réponse, puis mettez à jour votre réponse pour montrer que cela fonctionne.
Valamas
Vous pouvez utiliser comme dans les instructions if de t-sql. C'est pourquoi j'utilise like. Je ne vois pas pourquoi vous voulez me donner moins de points pour cela, mais pourquoi pas.
Thomas Koelle
9
Cela devrait être la méthode préférée; c'est plus élégant, moins verbeux et "aligné SQL": comme il utilise l'opérateur SQL LIKE standard, je n'ai pas besoin de lire la documentation pour le comprendre!
Fer García