Невозможно использовать функции в операторе SQL для изменения идентификатора, присвоенного возвращаемому столбцу. Способ SQL для указания идентификатора столбца в наборе результатов заключается в использовании подхода expr AS alias
.
Вместо того, чтобы обрезать начальные цифры, вы можете добавить к идентификатору другой допустимый символ. (Кажется, что обрезка начальных символов потенциально может привести к другой проблеме, дублированию и/или именам столбцов нулевой длины.)
Вы можете просто использовать оператор SQL для создания списка SELECT
для вас.
(ПРИМЕЧАНИЕ: функция GROUP_CONCAT
ограничена некоторыми системными/сессионными переменными: group_concat_max_len
и max_allowed_packet
, их достаточно легко настроить выше, хотя изменение глобального max_allowed_packet
может потребовать перезапуска MySQL.)
Чтобы вернуть список SELECT во всей одной строке (при условии, что вы не перейдете пределы GROUP_CONCAT
), что-то вроде:
SELECT c.table_schema
, c.table_name
, GROUP_CONCAT(
CONCAT('t.`',c.column_name,'` AS `x',c.column_name,'`')
ORDER BY c.ordinal_position
) AS select_list_expr
FROM information_schema.columns c
FROM information_schema.columns c
WHERE c.table_schema = 'mydatabase'
GROUP BY c.table_schema, c.table_name
Или вы могли бы даже вернуть весь оператор SELECT, если вы завернули это GROUP_CONCAT
выражение (которое создает список выбора) в другое CONCAT
Что-то вроде этого:
SELECT CONCAT('SELECT '
, GROUP_CONCAT(
<select_list_expr>
)
, ' FROM `',c.table_schema,'`.`',c.table_name,'` t;'
) AS stmt
FROM information_schema.columns c
WHERE c.table_schema = 'mydatabase'
GROUP BY c.table_schema, c.table_name
Вы можете использовать более умное выражение для <select_list_expr>
, чтобы проверить наличие начальных «цифровых» символов и назначить псевдоним только тем столбцам, которые в нем нуждаются, и оставить другие столбцы без изменений, хотя это снова создает возможность возврата повторяющихся имен столбцов.
То есть, если у вас уже есть столбцы с именами '1_X'
и 'x1_X'
в одной таблице. Но тщательно подобранный главный герой может избежать этой проблемы...
<select_list_expr>
мог бы быть более умным, выполнив условный тест для начального символа цифры, что-то вроде этого:
SELECT CONCAT('SELECT '
, GROUP_CONCAT(
CASE
WHEN c.column_name REGEXP '^[[:digit:]]'
THEN CONCAT('t.`',c.column_name,'` AS `x',c.column_name,'`')
ELSE CONCAT('t.`',c.column_name,'`')
END
)
, ' FROM `',c.table_schema,'`.`',c.table_name,'` t;'
) AS stmt
FROM information_schema.columns c
WHERE c.table_schema = 'mydatabase'
GROUP BY c.table_schema, c.table_name
Опять же, при таком подходе существует вероятность создания «дубликатов» имен столбцов. Условный тест «c.column_name REGEXP
» может быть расширен для проверки других «недопустимых» начальных символов.
В качестве примечания: в какой-то момент кто-то подумал, что «хорошей идеей» будет именовать столбцы с помощью начальных цифр. То, что что-то разрешено, не означает, что это хорошая идея.
С другой стороны, может быть, все эти ригамаролы не нужны, и для вашего приложения будет достаточно просто обернуть имена столбцов обратными кавычками.
person
spencer7593
schedule
27.03.2014