6

問題

クエリで代替列名(エイリアス)を使用しています。エイリアス「given_name」をORDER BYの一部として使用できますが、WHERE句の一部として使用できません。WHERE "given_name"は、私の制御できない要求の結果として渡され、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
4

3 に答える 3

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 句と順序なし) から一時テーブルを作成するだけで機能します。次に、この中から必要な列名を選択します。

より良いアプローチは、必要な列名でビューを作成し、ビューから選択することです...

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
于 2012-03-12T09:44:41.817 に答える
3

列のエイリアスは、GROUP BY、ORDER BY、または HAVING 句でのみ使用できます。

標準 SQL では、WHERE 句で列のエイリアスを参照できません。この制限が課されるのは、WHERE コードが実行されるときに、列の値がまだ決定されていない可能性があるためです。

于 2012-03-12T09:50:16.570 に答える
1

疑わしい場合は、単に番号で列を参照してください。

...
ORDER BY 2
...
于 2012-03-12T09:41:12.640 に答える