70 votes

Expressions booléennes dans la liste de sélection SQL

Je veux créer un SQL Select pour effectuer un test unitaire dans MS SQL Server 2005. L'idée de base est la suivante :

select 'Test Name', foo = 'Result'
from bar
where baz = (some criteria)

L'idée est que, si la valeur de la colonne "foo" est "Result", alors j'obtiendrais une valeur de true/1 ; si ce n'est pas le cas, j'obtiendrais false/0.

Malheureusement, T-SQL n'aime pas l'expression ; il s'étouffe sur le signe égal.

Existe-t-il un moyen d'évaluer une expression dans la liste de sélection SQL et d'obtenir un résultat retournable ? (Ou un autre moyen de réaliser les tests unitaires que je souhaite) ?


EDIT : 3 superbes réponses, toutes construites autour de CASE. J'accepte celle de feihtthief qui a le moins de réputation et qui en a donc le plus besoin :-) Merci à tous.

8 votes

Je ne cesserai jamais de m'étonner du ridicule de la gestion des booléens par TSQL. Bonne question, BTW.

99voto

feihtthief Points 1880

Utilisez la construction de cas :

select 'Test Name', 
    case when foo = 'Result' then 1 else 0 end 
    from bar where baz = (some criteria)

Voir aussi la documentation MSDN Transact-SQL CASE .

22voto

Joel Coehoorn Points 190579
SELECT 'TestName', 
    CASE WHEN Foo = 'Result' THEN 1 ELSE 0 END AS TestResult
FROM bar 
WHERE baz = @Criteria

0 votes

Retourne : (Pas de nom de colonne) | TestResult / TestName | 1

18voto

John Points 2343

Utilisez le CASE :

SELECT 'Test Name' [col1],
  CASE foo
    WHEN 'Result' THEN 1
    ELSE 0
  END AS [col2]
FROM bar
WHERE baz = (some criteria)

1 votes

Celle-ci est légèrement meilleure parce qu'elle utilise l'égalité optimisée "case", c'est à dire case foo when 'Result' plutôt que case when foo = 'Result'

0 votes

@MarkSowul : Pouvez-vous fournir quelques informations sur la façon dont le cas simple est optimisé par rapport au cas recherché ? J'ai toujours eu l'impression qu'un cas simple est évalué ou réécrit par l'analyseur syntaxique en un cas recherché, mais d'après cette ( sqlperformance.com/2014/06/t-sql-queries/ ) Je pense qu'il y a beaucoup de cas réels où vous pourriez avoir raison.

0 votes

Je suis désolé, je ne me souviens pas à ce stade. Je me souviens vaguement avoir vu différents plans d'exécution dans une situation particulière. C'était aussi avant SQL 2012. En fin de compte, comme le "cas simple" (cas x lorsque y) est plus restreint, l'optimiseur devrait avoir plus de facilité à le traiter.

17voto

Sebastian G Points 161

Vous pouvez également utiliser :

select 
    'Test Name', 
    iif(foo = 'Result', 1, 0)
from bar 
where baz = (some criteria)

Je sais que cette question a été posée il y a un certain temps, mais j'espère que cela aidera quelqu'un.

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