2016-02-24 5 views
2

У меня есть этот кусок кода (смотрите ниже). Я постоянно получаю сообщение об ошибке:?! «Неверное имя столбца„SuppFinish2“SQL - Псевдоним в операциях CASE

SELECT 

CASE 
    WHEN [RegFinish] IS NULL THEN '' 
    ELSE [RegFinish] 
END AS [RegFinish], 

CASE 
    WHEN [SuppFinish] IS NULL THEN '' 
    ELSE [SuppFinish] 
END AS [SuppFinish2], 

CASE 
    WHEN [RegFinish]<[SuppFinish2] THEN '1' 
    ELSE '0' 
END AS [TEST] 

FROM TABLE 

Является ли это из-за [SuppFinish2] является псевдонимом Благодаря

+2

Рассмотрим ISNULL(), а не CASE –

+1

Вы не можете ссылаться на другие поля, выбранные в предложении SELECT. –

+0

Сравнение 'RegFinish <''', вероятно, не то, что вы хотите, описать логику этого условия, когда 'SuppFinish' является' NULL' –

ответ

1

Вы не можете использовать эти псевдонимы на том же уровне, как вы их создали, becuase они не существующие еще .. завернуть запрос с другим выбрать так:

SELECT * , 
     CASE 
      WHEN [RegFinish]<[SuppFinish2] THEN '1' 
      ELSE '0' 
     END AS [TEST] 
FROM (
    SELECT 
     [ID], 
     CASE 
      WHEN [RegFinish] IS NULL THEN '' 
      ELSE [RegFinish] 
     END AS [RegFinish], 
     CASE 
      WHEN [SuppFinish] IS NULL THEN '' 
      ELSE [SuppFinish] 
     END AS [SuppFinish2], 
    FROM TABLE) 
+0

Спасибо! Как я могу добавить еще один столбец в этот запрос? Например, я хочу добавить [ID] из той же таблицы. – atomoutside

+0

@atomoutside обновлено, просто нужно поместить во внутренний запрос – sagi

+0

Как я и думал. Еще раз спасибо. – atomoutside

1

Для того, чтобы ссылаться на псевдонимы столбцов, можно использовать производную таблицу (или КТР, но это здесь не показан)

Select *, CASE 
WHEN [RegFinish]<[SuppFinish2] THEN '1' 
ELSE '0' 
END AS [TEST] From 
(
SELECT 

CASE 
    WHEN [RegFinish] IS NULL THEN '' 
    ELSE [RegFinish] 
END AS [RegFinish], 

CASE 
    WHEN [SuppFinish] IS NULL THEN '' 
    ELSE [SuppFinish] 
END AS [SuppFinish2] 
) T1 
FROM TABLE 
1

Как вы сказали его из-за псевдоним и псевдонимы столбцов можно ссылаться только на заказ по логическому порядку потока запросов

with cte 
as 
(
SELECT 
CASE 
    WHEN [RegFinish] IS NULL THEN '' 
    ELSE [RegFinish] 
END AS [RegFinish], 

CASE 
    WHEN [SuppFinish] IS NULL THEN '' 
    ELSE [SuppFinish] 
END AS [SuppFinish2] 
FROM TABLE 
) 
select 
CASE 
    WHEN [RegFinish]<[SuppFinish2] THEN '1' 
    ELSE '0' 
END AS [TEST] 
from cte 
1

Вы не можете в то же время установить и получить доступ к псевдониму в предложении SELECT. Я хотел бы предложить переписывать запрос с использованием CROSS APPLY:

SELECT t1.[RegFinish], 
     t2.[SuppFinish], 
     CASE 
      WHEN t1.[RegFinish] < t2.[SuppFinish] THEN '1' 
      ELSE '0' 
     END AS [TEST] 
FROM TABLE 
CROSS APPLY (SELECT COALESCE([RegFinish], '') AS [RegFinish]) AS t1 
CROSS APPLY (SELECT COALESCE([SuppFinish], '') AS [SuppFinish]) AS t2 
+0

. Честный вопрос: как использовать крест лучше, чем использовать CTE или производную таблицу? – Jeremy

+0

@Jeremy Это просто синтаксический сахар в этом случае, я думаю. По моему мнению, он выглядит более компактным и чистым. –

1
SELECT ISNULL([RegFinish],'') as [RegFinish] 
    , ISNULL([SuppFinish],'') as [SuppFinish2], CASE 
WHEN 
    ISNULL([RegFinish],'') < ISNULL([SuppFinish],'') THEN 1 
                ELSE 0 
END AS [TEST] 
FROM TABLE 

Почему бы не использовать ISNULL вместо CASE? Проблема с вашим запросом заключается в том, что [SuppFinish2] является псевдонимом не столбцом и может использоваться только в ORDER BY.

Смежные вопросы