Подтвердить что ты не робот

Использование проверки равенства между столбцами в предложении SELECT

Я использую Microsoft SQL Server 2012, и я бы хотел запустить этот, казалось бы, простой запрос:

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

Однако FirstEvent.TitleID = SecondEvent.TitleID AS titlesSameCheck в предложении SELECT является неправильным синтаксисом. Но документация SELECT (Transact-SQL) содержит этот синтаксис:

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 ]

Я думаю, это означает, что выражение справедливо в предложении select, и действительно приведенные примеры включают такие вещи, как 1 + 2. Глядя на документацию для выражений:

{ constant | scalar_function | [ table_name. ] column | variable 
    | ( expression ) | ( scalar_subquery ) 
    | { unary_operator } expression 
    | expression { binary_operator } expression 
    | ranking_windowed_function | aggregate_windowed_function
}

логические проверки равенства являются допустимыми выражениями, и действительно, выражение примера, приведенное в документации = (Equals) (Transact-SQL), включает в себя:

SELECT DepartmentID, Name
FROM HumanResources.Department
WHERE GroupName = 'Manufacturing'

хотя в предложении WHERE не указано условие SELECT. Похоже, я не могу использовать = оператор равенства для сравнения выражений в моем предложении SELECT, поскольку они ошибочно интерпретируются как назначение.

Как включить сравнение столбцов Boolean равенство, эквивалентное FirstEvent.TitleID = SecondEvent.TitleID AS titlesSameCheck в моем выражении SELECT?

4b9b3361

Ответ 1

Вот так:

case when FirstEvent.TitleID = SecondEvent.TitleID then 1 else 0 end as titlesSameCheck 

Ответ 2

Вы не можете использовать тип Boolean напрямую, кроме как в условных операторах (case, where, having и т.д.)

Лучший способ решить вашу проблему - сделать что-то вроде

select case when x = y then 'true' else 'false' end

Тип bit, вероятно, наиболее близок к логическому.

select CAST(case when x = y then 1 else 0 end as bit)

Конечно, используйте то, что два значения лучше всего представляют, что вы после.

Ответ 3

Как утверждают два существующих ответа, логические значения не могут быть возвращены в качестве значения столбца. Это описано в разделе "Операторы сравнения" :

В отличие от других типов данных SQL Server, тип данных Boolean не может быть указанный в качестве типа данных столбца или переменной таблицы, и не может возвращаться в результирующем наборе.

Учитывая это ограничение, использование CASE для преобразования значения в то, что может быть отображено, является вашей лучшей альтернативой.