You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CASE WHEN嵌套CONCAT时语法报错:Incorrect syntax near ','

解决SQL中CASE WHEN嵌套CONCAT的语法错误

我一眼就发现你代码里的问题了——嵌套的CASE语句语法不完整,加上逗号的位置不对,才触发了Incorrect syntax near ','这个错误。咱们一步步来修正:

错误原因分析

  1. 缺少CASE闭合关键字:你嵌套的CASE ISNULLABLE WHEN 'NO' THEN ' not null'没有用END收尾,SQL要求每个CASE表达式必须用END来闭合,否则解析器会报错。
  2. 缺失ELSE分支(可选但建议):虽然SQL允许CASE省略ELSE分支(此时会返回NULL),但显式指定ELSE ''可以确保当ISNULLABLE为'YES'时返回空字符串,避免CONCAT中混入NULL值干扰拼接结果。
  3. 逗号位置错误:你把逗号放在了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:39:58