CASE WHEN嵌套CONCAT时语法报错:Incorrect syntax near ','
解决SQL中CASE WHEN嵌套CONCAT的语法错误
我一眼就发现你代码里的问题了——嵌套的CASE语句语法不完整,加上逗号的位置不对,才触发了Incorrect syntax near ','这个错误。咱们一步步来修正:
错误原因分析
- 缺少CASE闭合关键字:你嵌套的
CASE ISNULLABLE WHEN 'NO' THEN ' not null'没有用END收尾,SQL要求每个CASE表达式必须用END来闭合,否则解析器会报错。 - 缺失ELSE分支(可选但建议):虽然SQL允许CASE省略ELSE分支(此时会返回NULL),但显式指定
ELSE ''可以确保当ISNULLABLE为'YES'时返回空字符串,避免CONCAT中混入NULL值干扰拼接结果。 - 逗号位置错误:你把逗号放在了CASE语句外面,而不是作为CONCAT的一个参数,导致解析器无法识别这个逗号的作用。
修正后的完整SQL代码
SELECT table_schema, column_name, CASE data_type WHEN 'nvarchar' THEN CONCAT( column_name, ' varchar(', CHARACTER_MAXIMUM_LENGTH, ')', CASE ISNULLABLE WHEN 'NO' THEN ' not null' ELSE '' END, ',' ) WHEN 'datetime2' THEN CONCAT(column_name, ' timestamp,') ELSE CONCAT(column_name, ' ', data_type, ',') -- 补上逗号保持所有列定义格式统一 END AS 'Postgres', IS_NULLABLE FROM information_schema.columns;
额外说明
- 我在ELSE分支里也补上了逗号,这样所有生成的列定义格式保持统一(都以逗号结尾)。如果不想最后一列带逗号,可以后续用字符串处理去掉,或者使用
STRING_AGG聚合列定义时自动处理分隔符。 - 嵌套CASE的逻辑现在是:当ISNULLABLE为'NO'时追加
' not null',否则追加空字符串,完美整合到CONCAT的拼接逻辑里,不会再出现语法错误。
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

