Ответ 1
Вот так:
case when FirstEvent.TitleID = SecondEvent.TitleID then 1 else 0 end as titlesSameCheck
Я использую 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
?
Вот так:
case when FirstEvent.TitleID = SecondEvent.TitleID then 1 else 0 end as titlesSameCheck
Вы не можете использовать тип 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)
Конечно, используйте то, что два значения лучше всего представляют, что вы после.
Как утверждают два существующих ответа, логические значения не могут быть возвращены в качестве значения столбца. Это описано в разделе "Операторы сравнения" :
В отличие от других типов данных SQL Server, тип данных Boolean не может быть указанный в качестве типа данных столбца или переменной таблицы, и не может возвращаться в результирующем наборе.
Учитывая это ограничение, использование CASE
для преобразования значения в то, что может быть отображено, является вашей лучшей альтернативой.