35

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 titlesSameCheckSELECT節の構文は正しくありません。ただし、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です。それらは代入として誤って解釈されているためです。

FirstEvent.TitleID = SecondEvent.TitleID AS titlesSameCheckに同等のブール等価列比較を含めるにはどうすればよいですか?SELECT

4

3 に答える 3

41

このような:

case when FirstEvent.TitleID = SecondEvent.TitleID then 1 else 0 end as titlesSameCheck 
于 2013-03-14T13:35:45.120 に答える
18

条件文 (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)

もちろん、求めているものを最もよく表している 2 つの値を使用してください。

于 2013-03-14T13:36:07.367 に答える
1

2つの既存の回答が示すように、ブール値を列値として返すことはできません。これは、比較演算子のセクションに記載されています。

他のSQLServerデータ型とは異なり、ブールデータ型はテーブル列または変数のデータ型として指定することはできず、結果セットで返すことはできません。

その制限を考えるとCASE、値を表示可能なものに変換するために使用するのが最善の選択肢です。

于 2013-03-14T13:45:09.097 に答える