SQL中CONCAT拼接超2个参数报SQL0440N错误问题咨询
问题说明
我目前正在学习SQL,练习Hackerrank平台上的字符串拼接类习题时,遇到CONCAT函数执行报错的问题:
- 最初按照常规多参数拼接的用法写SQL,尝试一次性拼接姓名、左括号、职业首字母、右括号四个部分,代码如下:
SELECT CONCAT(NAME, '(', LEFT(Occupation,1), ')') FROM OCCUPATIONS;
执行后返回报错:
SQL0440N No authorized routine named "CONCAT" of type "FUNCTION" having compatible arguments was found. SQLSTATE=42884
- 之后改用嵌套CONCAT的写法,保证每个CONCAT函数只传入2个参数,代码如下:
SELECT CONCAT(NAME, CONCAT(CONCAT('(', LEFT(Occupation,1)), ')')) FROM OCCUPATIONS;
这段代码可以正常执行,返回正确结果:
Kristeen(S) Maria(P) Meera(P) Naomi(P) Priya(D)
我测试后确认:单个CONCAT拼接任意2个字符串都能正常运行,只要传入2个以上参数就会执行失败,之前尝试用转义字符排查问题没有效果。网上其他用户的解法和我最初的多参数写法完全一致,都可以正常提交,因此想确认问题出在代码写法还是平台环境。
问题原因
这个问题是不同数据库的CONCAT函数语法差异导致的,和代码逻辑无关:
- 从返回的错误码
SQL0440N、SQLSTATE=42884可以判断,当前练习环境使用的是DB2数据库,DB2的原生CONCAT函数仅支持传入2个参数,不支持3个及以上参数的一次性拼接,所以传入4个参数时会提示找不到匹配的函数;嵌套写法每次只传2个参数,完全符合DB2的语法要求,因此可以正常执行。 - 网上其他用户能跑通多参数CONCAT写法,是因为他们提交时选择的数据库环境是MySQL、PostgreSQL或新版SQL Server,这类数据库的
CONCAT函数支持传入2个及以上任意数量的参数做拼接,因此多参数写法可以直接运行。
当前环境下的简化写法
除了多层嵌套CONCAT之外,在DB2环境下还可以用更简洁的写法实现相同效果,不需要写多层嵌套:
- 直接使用
||字符串拼接运算符,写法最简洁:
SELECT NAME || '(' || LEFT(Occupation, 1) || ')' FROM OCCUPATIONS;
- 混合使用CONCAT和
||运算符,减少嵌套层级:
SELECT CONCAT(NAME, '(' || LEFT(Occupation, 1) || ')') FROM OCCUPATIONS;
内容的提问来源于stack exchange,提问作者Cooper
相关产品推荐
相关产品推荐

