Псевдоним столбца в предложении WHERE - PullRequest
6 голосов
/ 12 марта 2012

Задача

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

Вопрос

  1. Есть ли способ / хак использовать псевдоним столбца в предложении WHERE?
  2. Есть ли способ найти имя столбца по псевдониму?

Исследования

После некоторого исследования похоже, что псевдоним добавляется после предложения 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

Ответы [ 3 ]

4 голосов
/ 12 марта 2012

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

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 и упорядочения) с именами столбцов, которые выуточнить.Затем выберите из этого списка нужные имена столбцов.

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

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
3 голосов
/ 12 марта 2012

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

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

1 голос
/ 12 марта 2012

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

...
ORDER BY 2
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...