web-dev-qa-db-fra.com

Utiliser des signes de comparaison dans une instruction sql case

Je cherche un moyen de construire des déclarations de cas dans une requête SQL Select en utilisant des signes inférieurs à et supérieurs à. Par exemple, je souhaite sélectionner un classement basé sur une variable:

DECLARE @a INT
SET @a = 0

SELECT CASE 
         WHEN @a < 3 THEN 0
         WHEN @a = 3 THEN 1
         WHEN @a > 3 THEN 2
       END

Je voudrais l'écrire comme:

DECLARE @a INT
SET @a = 0

SELECT CASE @a
         WHEN < 3 THEN 0
         WHEN 3 THEN 1
         WHEN > 3 THEN 2
       END

... mais SQL ne me laisse pas utiliser les signes <et> de cette façon. Existe-t-il un moyen de le faire est SQL 2005, ou dois-je utiliser le code comme dans le premier.

La raison de ne vouloir le code qu'une seule fois est parce que cela rendrait le code beaucoup plus lisible/maintenable et aussi parce que je ne sais pas si le serveur SQL devra exécuter le calcul pour chaque instruction CASE.

Je recherche un équivalent de déclaration de cas VB.NET:

Select Case i
    Case Is < 100
        p = 1
    Case Is >= 100
        p = 2
End Select

Peut-être que ce n'est pas possible en SQL et c'est ok, je veux juste le confirmer.

19
Greg

Vous pouvez utiliser la fonction SIGNE comme

DECLARE @a INT
SET @a = 0

SELECT CASE SIGN(@a - 3)
         WHEN -1 THEN 0
         WHEN 0 THEN 1
         WHEN 1 THEN 2
       END

Si @a est inférieur à 3, puis @a - 3 donne un entier négatif, dans lequel SIGN renvoie -1.

Si @a est égal ou supérieur à 3, puis SIGN renvoie respectivement 0 ou 1.


Si la sortie souhaitée est 0, 1 et 2, vous pouvez simplifier encore plus:

DECLARE @a INT
SET @a = 0

SELECT SIGN(@a - 3) + 1
25
Jose Rui Santos

Utiliser SIGN comme suggéré par @Jose Rui Santos semble une solution de contournement intéressante. Une alternative pourrait être d'affecter l'expression un alias, d'utiliser une sous-sélection et de tester l'expression (en utilisant son alias) dans la sélection externe:

SELECT
  …,
  CASE
    WHEN expr < 3 THEN …
    WHEN expr > 3 THEN …
  END AS …
FROM (
  SELECT
    …,
    a complex expression AS expr
  FROM …
  …
)
10
Andriy M
SELECT 
CASE 
WHEN ColumnName >=1 and ColumnName <=1 THEN 'Fail'
WHEN ColumnName >=6 THEN 'Pass'
ELSE 'Test'
END
FROM TableName
1
Venkat