1

サーバー側の処理で DataTables を使用する webapp があります。列のデータを任意に再グループ化する SQL クエリがいくつかあるので、次のようなクエリを取得します。

SELECT case `column`
WHEN 'value1' then 'group1'
WHEN 'value2' then 'group1'
ELSE `column` END AS `column grouped`, SUM(`2010`)
GROUP BY `colonne grouped`

ここで、ユーザー入力に基づいてフィルタリングを追加すると、次のようになります。

SELECT case `column`
WHEN 'value1' then 'group1'
WHEN 'value2' then 'group1'
ELSE `column` END AS `column grouped`, SUM(`2010`)
GROUP BY `column grouped`
HAVING `column grouped` LIKE '%test%'

それでも問題なく動作しますが、すべてを大文字と小文字を区別しないようにしようとすると問題が発生するため、次のようにします。

SELECT case `column`
WHEN 'value1' then 'group1'
WHEN 'value2' then 'group1'
ELSE `column` END AS `column grouped`, SUM(`2010`)
GROUP BY `colonne grouped`
HAVING UPPER(`column grouped`) LIKE '%test%'

そして今、「#1054 - 未知の列 'グループ化された列' が 'having 句' にある」というメッセージが表示されます

回避策として、私は次のようなことをします:

SELECT case `column`
WHEN 'value1' then 'group1'
WHEN 'value2' then 'group1'
ELSE `column` END AS `column grouped` , SUM(`2010`)
GROUP BY `colonne grouped`
HAVING UPPER(case `column`
WHEN 'value1' then 'group1'
WHEN 'value2' then 'group1'
ELSE `column` END) LIKE '%test%'

しかし、これは本当に便利ではありません。カスタムエイリアスで UPPER を使用できない理由を知っている人はいますか?

ちなみにMySQL5.5を使っています。

4

2 に答える 2

0

句を作っUPPERてみてくださいWHERE

      SELECT case `column`
     WHEN 'value1' then 'group1'
     WHEN 'value2' then 'group1'
     ELSE `column` END AS `column grouped`, SUM(`2010`)
     WHERE UPPER(`column grouped`) LIKE '%test%'
     GROUP BY `colonne grouped`
于 2013-03-18T17:20:51.007 に答える
0

ドキュメントによると、HAVING句で関数を使用することはできません:

SQL 標準では、HAVING は GROUP BY 句内の列または集計関数で使用される列のみを参照する必要があります。ただし、MySQL はこの動作の拡張機能をサポートしており、HAVING が SELECT リスト内の列および外部サブクエリ内の列も参照できるようにします。

既に取得した列に制限されています。背後に技術的な理由があるかどうかはわかりませんが、それが SQL 標準で義務付けられていることです。

于 2013-03-18T17:16:09.090 に答える