Столбец неизвестен с UPPER в предложении HAVING для псевдонима столбца

У меня есть веб-приложение, которое использует DataTables с обработкой на стороне сервера. У меня есть несколько 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 - Неизвестный столбец" столбец сгруппирован "в" имеющий предложение ""

В качестве обходного пути я делаю что-то вроде этого:

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 с пользовательским псевдонимом?

Я использую MySQL 5.5, кстати.

2 ответа

Решение

Согласно документам, вы не можете использовать функции в HAVING пункт:

Стандарт SQL требует, чтобы HAVING ссылался только на столбцы в предложении GROUP BY или столбцы, используемые в агрегатных функциях. Однако MySQL поддерживает расширение этого поведения и позволяет HAVING ссылаться на столбцы в списке SELECT и столбцы во внешних подзапросах.

Вы ограничены столбцами, которые вы уже получили. Я не знаю, есть ли техническая причина, но это то, что требует стандарт SQL.

Попробуйте сделать 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`
Другие вопросы по тегам