ГДЕ имя литого столбца равно - PullRequest
2 голосов
/ 22 июля 2011

Можно ли написать оператор where, который использует имя столбца, которое было назначено столбцу, а не имя столбца, которое фактически существует? Вся таблица создается динамически, а имена столбцов хранятся в другой таблице. У меня есть функция, которая позволяет пользователям добавлять фильтры к заданию перед получением набора данных, который идет вместе с ним.

Пример того, что я пытаюсь:

SELECT id, 
  col1 as [description], 
  col2 as [date1], 
  col3 as [image], 
  col4 as [date2], 
  col5 as [link], 
  col6 as [location], 
  col7 as [price], 
  col8 as [title]
FROM tableName
WHERE [title] = 'Lemons'

Ответы [ 2 ]

4 голосов
/ 22 июля 2011

Сделайте ваш исходный запрос подзапросом:

SELECT *
FROM (
   SELECT id, 
     col1 as [description], 
     col2 as [date1], 
     col3 as [image], 
     col4 as [date2], 
     col5 as [link], 
     col6 as [location], 
     col7 as [price], 
     col8 as [title]
   FROM tableName
) as subquery
WHERE [title] = 'Lemons'
3 голосов
/ 22 июля 2011

Ответ Кита правильный, но я объясню почему. Вы не можете ссылаться на псевдоним столбца в предложении WHERE. Причина этого основана на порядке, в котором система обрабатывает команду. Смотрим на эту команду и читаем сверху вниз. Тем не менее, ядро ​​базы данных смотрит на это как набор утверждений. Сначала он читает ваш оператор FROM, чтобы определить, к каким таблицам обращаться. Затем он читает ваш оператор WHERE, чтобы выяснить, какие данные включить / исключить. Наконец, он просматривает ваш оператор SELECT, чтобы определить, какие данные отображать.

Поскольку общий оператор оценивается в этом порядке, оператор WHERE не имеет доступа к псевдонимам, созданным в операторе SELECT, поскольку эти псевдонимы еще не обработаны. Следовательно, нельзя строго ссылаться на псевдоним столбца в операторе WHERE. Обычный способ обойти это - заключить весь оператор в подзапрос. Единственная проблема с этим заключается в том, что вы будете испытывать падение производительности. Причина этого в том, что вы будете возвращать все строки и затем удалять некоторые вместо того, чтобы выполнять удаление перед извлечением.

...