我对动态SQL相当陌生。我正在做一个特定的任务,尽管我做的事情就像谷歌上的某些MySQL站点一样,但我遇到了一个语法错误。那里可能出了什么问题?提前谢谢。对应用的解决方案表示赞赏。
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when field_key = ''',
DAY(birth_date),
''' then field_value end) ',
DAY(birth_date)
)
) INTO @sql
FROM
employees;
SET @sql = CONCAT('SELECT address, ', @sql, '
FROM employees
GROUP BY address');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;实际错误:
18:41:44从@sql错误代码: 1064准备stmt。您的SQL语法有错误;请检查与您的MySQL服务器版本对应的手册,以获得接近'1,max(当field_key = '10‘然后field_value结束时)的正确语法) 10,最大值(在第1行0.000秒
处使用field_ke时)。
发布于 2021-05-18 17:04:52
您似乎在使用整数作为列别名。这将导致任何SQL中的错误,而不仅仅是动态SQL:
mysql> select 'abc' 1, 'def' 2 from dual;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual
that corresponds to your MySQL server version for the right syntax to use
near '1, 'def' 2 from dual' at line 1您可以通过在别名周围使用倒计时来解决这个问题:
mysql> select 'abc' as `1`, 'def' as `2` from dual;
+-----+-----+
| 1 | 2 |
+-----+-----+
| abc | def |
+-----+-----+或在别名前加上一个非数字字符:
mysql> select 'abc' as day1, 'def' as day2 from dual;
+------+------+
| day1 | day2 |
+------+------+
| abc | def |
+------+------+
mysql> select 'abc' as _1, 'def' as _2 from dual;
+-----+-----+
| _1 | _2 |
+-----+-----+
| abc | def |
+-----+-----+关于你的评论:
以下是你如何在化名周围放回滴答声:
...
CONCAT(
'max(case when field_key = ''',
DAY(birth_date),
''' then field_value end) `',
DAY(birth_date), '`'
)
...或添加前缀:
...
CONCAT(
'max(case when field_key = ''',
DAY(birth_date),
''' then field_value end) as day',
DAY(birth_date)
)
...https://stackoverflow.com/questions/67590600
复制相似问题