À 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?

Regardez de plus près à <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

Leave a Reply

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *