À l'aide d'un contrôle d'égalité entre les colonnes dans une clause SELECT
Je suis à l'aide de Microsoft SQL Server 2012 et je voudrais que cette apparemment simple requête:
SELECT
FirstEvent.id AS firstEventID,
SecondEvent.id AS secondEventID,
DATEDIFF(second, FirstEvent.WndFGEnd, SecondEvent.WndFGStart) AS gap,
FirstEvent.TitleID = SecondEvent.TitleID AS titlesSameCheck
FROM VibeFGEvents AS FirstEvent
RIGHT OUTER JOIN VibeFGEvents AS SecondEvent
ON
FirstEvent.intervalMode = SecondEvent.intervalMode
AND FirstEvent.id = SecondEvent.id - 1
AND FirstEvent.logID = SecondEvent.logID
Cependant FirstEvent.TitleID = SecondEvent.TitleID AS titlesSameCheck
dans le SELECT
clause est une syntaxe incorrecte. Mais la Clause SELECT (Transact-SQL) documentation comprend cette syntaxe:
SELECT [ ALL | DISTINCT ]
[ TOP ( expression ) [ PERCENT ] [ WITH TIES ] ]
<select_list>
<select_list> ::=
{
*
| { table_name | view_name | table_alias }.*
| {
[ { table_name | view_name | table_alias }. ]
{ column_name | $IDENTITY | $ROWGUID }
| udt_column_name [ { . | :: } { { property_name | field_name }
| method_name ( argument [ ,...n] ) } ]
| expression
[ [ AS ] column_alias ]
}
| column_alias = expression
} [ ,...n ]
Je pense que cela signifie une expression est valable dans la clause select et en effet les exemples donnés comprennent des choses comme 1 + 2
. En regardant la documentation pour les expressions:
{ constant | scalar_function | [ table_name. ] column | variable
| ( expression ) | ( scalar_subquery )
| { unary_operator } expression
| expression { binary_operator } expression
| ranking_windowed_function | aggregate_windowed_function
}
boolean contrôles d'égalité sont des expressions valides et en effet l'exemple de l'expression donnée dans l' = (Égal) (Transact-SQL) documentation comprend:
SELECT DepartmentID, Name
FROM HumanResources.Department
WHERE GroupName = 'Manufacturing'
bien que dans le WHERE
clause de non le SELECT
clause. Il semble que je ne peut pas utiliser =
l'opérateur d'égalité pour comparer des expressions dans mon SELECT
clause comme ils sont en train d'être interprété à tort comme une attribution.
Comment puis-je inclure un Booléen égalité colonne comparaison équivalente à FirstEvent.TitleID = SecondEvent.TitleID AS titlesSameCheck
dans mon SELECT
clause?
<select_list>
définition: column_alias = expression
est une autre forme de colonne de l'aliasing.J'ai vu, mais je m'attends à ce que le compilateur pour être en mesure de distinguer l'aliasing de la comparaison. Pour moi personnellement, en les gardant séparés (aliasing en utilisant
AS
, d'attribution de l'aide =
, et la comparaison à l'aide de ==
) mais je pense qu'il y a des raisons historiques pourquoi tSQL n'est pas claire comme ça?OriginalL'auteur dumbledad | 2013-03-14
Vous devez vous connecter pour publier un commentaire.
Comme ceci:
OriginalL'auteur Dumitrescu Bogdan
Vous ne pouvez pas utiliser le type Booléen directement, sauf dans les instructions conditionnelles (cas, où, ayant, etc.)
Meilleure façon de résoudre votre problème, c'est de faire quelque chose comme
La
bit
type de est probablement le plus proche de booléens.Bien sûr, l'utilisation selon deux valeurs représentent le mieux ce que vous êtes après.
Pensé que, immédiatement après leur publication, merci!
OriginalL'auteur pyrospade
Que les deux réponses de l'état, des valeurs booléennes peuvent pas être retournés comme une valeur de la colonne. Ceci est documenté dans le Les Opérateurs de comparaison section:
Compte tenu de cette restriction, à l'aide de
CASE
à transformer la valeur à quelque chose qui peut être affiché est votre meilleure alternative.OriginalL'auteur Allan