这是不可能的使用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
(W HICH产生选择列表),在另一个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
”可以扩展以检查其他“无效”主角。
作为一个方面说明,在某些时候,有人认为这是一个“好主意”,以命名带有前导数字字符的列。仅仅因为允许某件事并不意味着这是一个好主意。
再说,也许一切rigamarole是没有必要的,只是在反引号包裹的列名就足够了您的应用。
prepending也可以很好地工作,这看起来很有希望,我迫不及待地想要开展工作。我用来将CSV数据提供给mysql数据库的程序已经使用了这种格式多年,现在我有成千上万的具有前导数字的列,并且没有终点。我会仔细检查引入反引号。 – user3306708
我试图自己弄清楚这一点,但我遇到了麻烦,因为我也想了解更多关于CONCAT的信息。这工作几乎完美,但我无法在单个表上运行此查询。 – user3306708
您可以添加“'AND c.table_name ='mytablename''”。我不确定我是否清楚,这个查询不针对任何特定的表,它只是产生一个SQL语句,将从表中提取行。它产生的SELECT语句可以作为CREATE VIEW语句的一部分使用,但我没有(也没有)建议这样做,因为您不想将性能查杀视图引入到您的MySQL模式中。 – spencer7593