121 votes

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

J'essaie de détecter si le serveur fonctionne avec 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é de C#).

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

160voto

Kirill Polishchuk Points 28058

Commence par

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 (à 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);

3 votes

Notez qu'en interne, ils fonctionnent différemment, notamment en ce qui concerne les performances et l'utilisation des index. Par exemple, une requête utilisant colName LIKE 'prefix%' sera très rapide lorsque colName est indexé, mais colName LIKE '%substring%' o colName LIKE '%suffix' sera lent car le serveur SQL ne crée pas d'arbres de suffixes lors de l'indexation du texte. De même, l'utilisation de LEFT avec une colonne sera également lente car ces requêtes ne sont pas SARGable. La SARGabilité est importante : dba.stackexchange.com/questions/162263/

0 votes

Je vous recommande de tester la méthode LIKE 'x%' mentionnée ci-dessous. Dans certains cas, elle est beaucoup plus rapide

1 votes

Logiquement, je devrais éviter charindex Je suppose que charindex va chercher la chaîne entière pour trouver le premier caractère, puis vérifier le deuxième caractère, etc. Par exemple, il ne se rendra pas compte que vous n'êtes pas intéressé si la chaîne commence à la position 2 ou plus.

77voto

Gary.S Points 4546

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)

0 votes

Pourquoi ne pas utiliser LIKE Express Edition% ? De plus, votre solution ne renvoie-t-elle pas vrai si "Express Edition" se trouve quelque part dans la chaîne ? Donc, c'est plus spécifiquement une façon de faire du type "Contient".

3 votes

@mmcrae Bien qu'il soit possible d'utiliser la version similaire ci-dessous, c'est 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 vrai que si la variable commence par (charindex retourne 1) l'argument donné. La deuxième expression est un "contains" car elle retournera vrai si l'argument est trouvé n'importe où dans la chaîne (charindex retourne 1 ou plus).

59voto

Thomas Koelle Points 65

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

0 votes

Si vous lisez la question, il ne s'agit pas d'une requête. Essayez mon exemple avec votre réponse et mettez ensuite à jour votre réponse en montrant que cela fonctionne.

1 votes

Vous pouvez l'utiliser comme dans les déclarations if en t-sql. C'est pourquoi j'utilise like. Je ne vois pas pourquoi vous voulez me donner des points de moins pour cela, mais pourquoi pas.

13 votes

Cette méthode devrait être privilégiée ; elle est plus élégante, moins verbeuse et "alignée sur SQL" : comme elle utilise l'opérateur SQL LIKE standard, je ne devrais pas avoir besoin de lire la documentation pour la comprendre !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X