0

「CASE WHEN」ステートメントがクエリに非常に役立つことがわかりました。しかし、これは私のクエリです(選択のみ):

SELECT  dbo.ARCHIVE.SYSTEM_KEY AS PROTOCOLLO, 
        CASE dbo.ARCHIVEDEST.ERR_ID WHEN 0 THEN 'OK' ELSE 'KO' END AS ESITO, 
        CASE WHEN dbo.ARCHIVEDEST.XMODE IN ('R', 'K', 'H') THEN 'RX' ELSE 'TX' END AS 'T/R', 
        CASE 'T/R' WHEN 'TX' THEN CONTACTORIGIN.address ELSE CONTACTDESTINATION.address END AS Utente, 

問題は 3 番目の Case ステートメントにあります。以前の 'T/R' クエリを評価しないためです (すべてのレコードに対して 'CONTACTORIGIN.address' が返されます)。

4

4 に答える 4

0

テストを繰り返す必要があります。

SELECT  dbo.ARCHIVE.SYSTEM_KEY AS PROTOCOLLO, 
        CASE dbo.ARCHIVEDEST.ERR_ID WHEN 0 THEN 'OK' ELSE 'KO' END AS ESITO, 
        CASE WHEN dbo.ARCHIVEDEST.XMODE IN ('R', 'K', 'H') THEN 'RX' ELSE 'TX' END AS 'T/R', 
        CASE CASE WHEN dbo.ARCHIVEDEST.XMODE NOT IN ('R', 'K', 'H') THEN CONTACTORIGIN.address ELSE CONTACTDESTINATION.address END AS Utente, 

または、サブクエリを作成できます:

SELECT PROTOCOLLO, ESITO, [T/R],
    CASE WHEN [T/R] = 'TX' THEN CONTACTORIGIN.address ELSE CONTACTDESTINATION.address END AS Utente
FROM
(SELECT  dbo.ARCHIVE.SYSTEM_KEY AS PROTOCOLLO, 
        CASE dbo.ARCHIVEDEST.ERR_ID WHEN 0 THEN 'OK' ELSE 'KO' END AS ESITO, 
        CASE WHEN dbo.ARCHIVEDEST.XMODE IN ('R', 'K', 'H') THEN 'RX' ELSE 'TX' END AS [T/R], 
) s
于 2013-06-11T08:17:30.513 に答える
0

case ステートメントを繰り返したくない場合は、2 つのオプションがあります。1 つ目は、そのうちの 1 つをサブクエリに移動することです。つまり、

SELECT  PROTOCOLLO,
        ESITO,
        [T/R],
        CASE [T/R] WHEN 'TX' THEN CONTACTORIGIN.address ELSE CONTACTDESTINATION.address END AS Utente
FROM    (   SELECT  dbo.ARCHIVE.SYSTEM_KEY AS PROTOCOLLO, 
                    CASE dbo.ARCHIVEDEST.ERR_ID WHEN 0 THEN 'OK' ELSE 'KO' END AS ESITO, 
                    CASE WHEN dbo.ARCHIVEDEST.XMODE IN ('R', 'K', 'H') THEN 'RX' ELSE 'TX' END AS 'T/R'
            FROM    ....
        ) SubQuery

CROSS APPLYまたは、CASE ステートメントを:内に移動することもできます。

SELECT  dbo.ARCHIVE.SYSTEM_KEY AS PROTOCOLLO, 
        CASE dbo.ARCHIVEDEST.ERR_ID WHEN 0 THEN 'OK' ELSE 'KO' END AS ESITO, 
        'T/R', 
        CASE [T/R] WHEN 'TX' THEN CONTACTORIGIN.address ELSE CONTACTDESTINATION.address END AS Utente
FROM    ...
        CROSS APPLY
        (   SELECT  CASE WHEN dbo.ARCHIVEDEST.XMODE IN ('R', 'K', 'H') THEN 'RX' ELSE 'TX' END AS 'T/R'
        ) tx
于 2013-06-11T08:20:00.220 に答える
0

サブクエリを使用してT/Rエイリアスを定義します。

SELECT  *
,       CASE 'T/R' WHEN 'TX' THEN CONTACTORIGIN.address ELSE CONTACTDESTINATION.address 
            END AS Utente
FROM    (
        SELECT  CASE dbo.ARCHIVEDEST.ERR_ID WHEN 0 THEN 'OK' ELSE 'KO' END AS ESITO
        ,       CASE WHEN dbo.ARCHIVEDEST.XMODE IN ('R', 'K', 'H') THEN 'RX' ELSE 'TX' 
                    END AS 'T/R'
        FROM    dbo.ARCHIVE.SYSTEM_KEY AS PROTOCOLLO
        ) as SubQueryAlias
于 2013-06-11T08:20:11.160 に答える
0

句内の列の値をSELECT計算している場合、同じ句で計算されている他の計算値にアクセスすることはできません。これは、SELECT(SQL 標準に従って) 列が並列で計算されているためです (そうでない場合があります)。 、ただし、一部の実装ではこれ行われると想定されているため)、計算された値はまだ利用できません。

「以前の」計算をサブクエリまたは CTE に入れることができます。

SELECT *,
    CASE [T/R] WHEN 'TX' THEN CONTACTORIGIN.address ELSE CONTACTDESTINATION.address END AS Utente
FROM (
    SELECT  dbo.ARCHIVE.SYSTEM_KEY AS PROTOCOLLO, 
        CASE dbo.ARCHIVEDEST.ERR_ID WHEN 0 THEN 'OK' ELSE 'KO' END AS ESITO, 
        CASE WHEN dbo.ARCHIVEDEST.XMODE IN ('R', 'K', 'H') THEN 'RX' ELSE 'TX' END AS [T/R], 

    ...
) t
于 2013-06-11T08:22:01.623 に答える