Столбец неизвестен с 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`