tipos sentencias ejemplos datos consultas complejas sql sql-server select equality

sentencias - tipos de consultas en mysql



Uso de una verificación de igualdad entre columnas en una cláusula SELECT (3)

Estoy utilizando Microsoft SQL Server 2012 y me gustaría ejecutar esta consulta aparentemente simple:

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

Sin embargo, FirstEvent.TitleID = SecondEvent.TitleID AS titlesSameCheck en la cláusula SELECT es sintaxis incorrecta. Pero la documentación de la cláusula SELECT (Transact-SQL) incluye esta sintaxis:

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 ]

Creo que eso significa que una expresión es válida en la cláusula de selección y, de hecho, los ejemplos dados incluyen cosas como 1 + 2 . Mirando la documentación para expresiones :

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

Las comprobaciones de igualdad booleanas son expresiones válidas y, de hecho, la expresión de ejemplo que figura en la documentación = (Equals) (Transact-SQL) incluye una:

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

aunque en la cláusula WHERE no en la cláusula SELECT . Parece que no puedo usar = el operador de igualdad para comparar expresiones en mi cláusula SELECT ya que se están interpretando erróneamente como asignación.

¿Cómo FirstEvent.TitleID = SecondEvent.TitleID AS titlesSameCheck comparación de columna de igualdad booleana equivalente a FirstEvent.TitleID = SecondEvent.TitleID AS titlesSameCheck en mi cláusula SELECT ?


Como las dos respuestas existentes se establecen, los valores booleanos no se pueden devolver como un valor de columna. Esto se documenta en la sección Operadores de comparación :

A diferencia de otros tipos de datos de SQL Server, un tipo de datos booleano no se puede especificar como el tipo de datos de una columna o variable de tabla, y no se puede devolver en un conjunto de resultados.

Dada esa restricción, usar su CASE para transformar el valor en algo que pueda mostrarse es su mejor alternativa.


Me gusta esto:

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


No puede utilizar el tipo booleano directamente, excepto en sentencias condicionales (caso, dónde, tener, etc.)

La mejor manera de resolver tu problema es hacer algo como

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

El tipo de bit es probablemente el más cercano al booleano.

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

Por supuesto, el uso de cualquiera de los dos valores representa mejor lo que está buscando.