2013-06-11 2 views
0

Я нашел инструкцию «CASE WHEN» очень полезную для моего запроса. Но это мой запрос (выбрать только):Sql Case Когда запрос

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, 

проблема находится на третьем заявлении Case, потому что не оценить предыдущий запрос «T/R» (для всех записей он вернется «CONTACTORIGIN.address». можно это сделать или я нахожусь в неправильном

ответ

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 
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 
+0

Также может рассмотреть возможность использования подзапросов или представления. – Gedrox

+0

Просто редактировал мой ответ, добавляя подзапрос, хорошая точка :) –

0

Если вы не хотите, чтобы повторить свои заявления Если у Вас есть два варианта, первый, чтобы переместить одну из них подзапроса, т.е.

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 :

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 
0

Когда вы вычисления значения для столбца в предложении SELECT, вы не разрешается доступ к любой другой вычисленное значение вычисляемого в том же SELECT пункте - потому что (в соответствии со стандартом SQL) столбцы (они могут и не быть, но предполагается, что некоторые реализации будут делать это), поэтому вычисленные значения еще недоступны.

Вы можете поместить «ранее» расчеты в подзапроса или КТР:

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 
Смежные вопросы