2012-03-12 4 views
6

Проблема

Я использую альтернативное имя столбца (псевдоним) в запросе, можно использовать псевдоним «given_name» в рамках ORDER BY, но я не в состоянии использовать его в качестве части предложение WHERE. WHERE «given_name» передается в результате запроса из моего контроля, и я не знаю фактического имени столбца, которое должно использоваться в условии WHERE.Колонка Алиас в выражении WHERE

Вопрос

  1. Это есть способ/взломать использовать псевдоним столбца в ИНЕКЕ?
  2. Есть ли способ найти имя столбца из псевдонима?

Research

После некоторых исследований он выглядит как псевдоним добавляются после после предложения WHERE.

Пример

SELECT profile.id AS id, given.name AS 'given_name', family.name AS 'family_name' 
FROM green_profile profile 
LEFT JOIN green_name given ON given.profileid = profile.id AND given.name_typeid = 0 
LEFT JOIN green_name family ON family.profileid = profile.id AND family.name_typeid = 1 
WHERE given_name LIKE 'levi%' 
ORDER BY given_name DESC LIMIT 0 , 25 

ответ

4

проверялось, но этот хак должен работать ...

SELECT * FROM ( 
    SELECT profile.id AS id, given.name AS 'given_name', family.name AS 'family_name' 
    FROM green_profile profile 
    LEFT JOIN green_name given ON given.profileid = profile.id AND given.name_typeid = 0 
    LEFT JOIN green_name family ON family.profileid = profile.id AND family.name_typeid = 1 
) as temptable 
WHERE given_name LIKE 'levi%' 
ORDER BY given_name DESC LIMIT 0 , 25 

Он работает просто создав временную таблицу из вашего исходного оператора select (без предложения where и порядка), который имеет столбец na mes, который вы указываете. Затем вы выбираете это с именами столбцов, которые вы хотите.

Лучше подход может создать представление, с именами столбцов, которые вы хотите, и выбрать с точки зрения ...

CREATE VIEW newtable AS 
SELECT profile.id AS id, given.name AS 'given_name', family.name AS 'family_name' 
FROM green_profile profile 
LEFT JOIN green_name given ON given.profileid = profile.id AND given.name_typeid = 0 
LEFT JOIN green_name family ON family.profileid = profile.id AND family.name_typeid = 1; 

А потом ...

SELECT * FROM newtable 
WHERE given_name LIKE 'levi%' 
ORDER BY given_name DESC LIMIT 0 , 25 
+0

Спасибо, большое объяснение. Оба решения работают, однако после сопоставления с большой таблицей решение обзора обеспечивает гораздо лучшую производительность. –

+0

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

1

В сомневаетесь, просто обратитесь к колонке по номеру:

... 
ORDER BY 2 
... 
+0

Не будет ли лучше использовать полное имя 'given.name'? порядок столбцов на самом деле не является надежным подходом –

+0

Это работает, однако «given_name» было передано в результате запроса клиента из моего контроля. У меня нет способа определить номер столбца или что «given_name» является псевдонимом для данного.name. –

3

Вы можете используйте только псевдонимы столбцов в предложениях GROUP BY, ORDER BY или HAVING.

Стандарт SQL не позволяет ссылаться на псевдоним столбца в предложении WHERE. Это ограничение наложено, потому что, когда выполняется код WHERE, значение столбца может еще не определено.

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