Фильтровать по псевдониму столбца - PullRequest
12 голосов
/ 22 февраля 2010

Я использую SqlServer 2005 и у меня есть столбец, который я назвал.

Запрос выглядит примерно так:

SELECT id, CASE WHEN <snip extensive column definition> END AS myAlias
FROM myTable
WHERE myAlias IS NOT NULL

Однако, это дает мне ошибку:

"Неверное имя столбца 'myAlias'."

Есть ли способ обойти это? Раньше я включал определение столбца в раздел WHERE или HAVING, но в основном это было просто: IE COUNT (*) или что-то еще. Я могу включить полное определение столбца в этот специальный запрос, но если по какой-то причине мне нужно было сделать это в производственном запросе, я бы предпочел иметь определение столбца только один раз, поэтому мне не нужно обновлять оба (и забудь сделать один раз в какой-то момент)

Ответы [ 5 ]

14 голосов
/ 22 февраля 2010

Вы не можете ссылаться на псевдонимы в таком предложении where, как это ... вам нужно либо дублировать CASE в WHERE, либо вы можете использовать подзапрос, подобный этому:

SELECT id, myAlias
FROM
(
    SELECT id, CASE WHEN <snip extensive column definition> END AS myAlias
    FROM myTable
) data
WHERE myAlias IS NOT NULL
5 голосов
/ 22 февраля 2010

Использование CTE также возможно:

;with cte (id, myAlias)
 as (select id, case when <snip extensive column definition> end as myAlias 
      from myTable)
 select id, myAlias
  from cte
  where myAlias is not null
2 голосов
/ 22 февраля 2010

Поместите тот же оператор CASE в предложение WHERE:

SELECT id, CASE WHEN <snip extensive column definition> END AS myAlias
FROM myTable
WHERE CASE WHEN <snip extensive column definition> END IS NOT NULL

EDIT

Другим вариантом является вложение запроса:

SELECT id, myAlias
FROM (
    SELECT id, CASE WHEN <snip extensive column definition> END AS myAlias
    FROM myTable
) AS subTable
WHERE myAlias IS NOT NULL

(Изменить: удалена HAVING опция, так как это было неправильно (спасибо @ OMG Ponies ))

1 голос
/ 22 февраля 2010

положить дело в где. SQL Server будет достаточно умен, чтобы просто оценить его один раз, поэтому вы не будете дублировать код:

SELECT id, CASE WHEN <snip extensive column definition> END AS myAlias
FROM myTable
WHERE CASE WHEN <snip extensive column definition> END IS NOT NULL

вы можете поместить его в производную таблицу:

SELECT dt.id, dt.myAlias
    FROM (
          SELECT id, CASE WHEN <snip extensive column definition> END AS myAlias
          FROM myTable
         ) dt
    WHERE dt.myAlias IS NOT NULL

Однако я стараюсь избегать получения производных таблиц без ограничительного ГДЕ. Вы можете попробовать, чтобы увидеть, влияет ли это на производительность или нет.

0 голосов
/ 16 февраля 2018

В итоге я создал временную таблицу для этого. Вот некоторый псевдокод, чтобы дать вам идею. Это работало со сложным объединением, я просто показываю простой случай здесь.

--Check to see if the temp table already exists
If(OBJECT_ID('tempdb..#TempTable') Is Not Null)
Begin
    DROP TABLE #TempTable
End

--Create the temp table
CREATE TABLE #TempTable
{
     YourValues NVARCHAR(100)
}

--Insert your data into the temp table        
INSERT INTO #TempTable(YourValues)
SELECT yt.Column1 as YourColumnOne FROM YourTable yt

--Query the filtered data based on the aliased column    
SELECT * 
FROM #TempTable
WHERE YourColumnOne = 'DataToFilterOn'

--Don't forget to remove the temp table
DROP TABLE #TempTable
...