能否通过拼接VARCHAR2类型列更新ARTICLE表DESCRIPTION字段?
解决Oracle VARCHAR2字段拼接更新的问题
嘿,我来帮你排查这两个UPDATE语句的问题,其实都是Oracle字符串拼接的语法细节没注意到~
你的两个语句的错误点
- 第一个语句用了
+拼接字符串:Oracle里+是数值运算符号,不能用来拼接字符串,字符串拼接得用||操作符,用+的话Oracle会把字段当成数值处理,自然报错。 - 第二个语句的问题:
- Oracle的
concat()函数默认只支持两个参数,直接传多个参数会触发语法错误; - 语句里
LEVEL2_DESCRIPTION和' '之间少了一个逗号,导致语法不完整。
- Oracle的
正确的写法示例
方式1:用||拼接(推荐,更直观)
这是Oracle里最常用的字符串拼接方式,支持多个字符串连续拼接:
UPDATE ARTICLE SET DESCRIPTION = CPV_DESCRIPTION || '/' || LEVEL1_DESCRIPTION || ' ' || LEVEL2_DESCRIPTION || ' ' || LEVEL3_DESCRIPTION WHERE ID_ARTICULO = 209;
方式2:嵌套使用concat()(适合习惯用函数的场景)
如果一定要用concat(),需要嵌套调用,因为每次只能传两个参数:
UPDATE ARTICLE SET DESCRIPTION = concat( concat( concat( concat(CPV_DESCRIPTION, '/'), LEVEL1_DESCRIPTION ), ' ' || LEVEL2_DESCRIPTION ), ' ' || LEVEL3_DESCRIPTION ) WHERE ID_ARTICULO = 209;
额外提示
如果你的CPV_DESCRIPTION、LEVEL1_DESCRIPTION等字段可能存在NULL值,拼接后整个结果会变成NULL,可以用NVL()函数把NULL转为空字符串,避免这个问题:
UPDATE ARTICLE SET DESCRIPTION = NVL(CPV_DESCRIPTION, '') || '/' || NVL(LEVEL1_DESCRIPTION, '') || ' ' || NVL(LEVEL2_DESCRIPTION, '') || ' ' || NVL(LEVEL3_DESCRIPTION, '') WHERE ID_ARTICULO = 209;
内容的提问来源于stack exchange,提问作者Arnau Van Boschken ArnauB
相关产品推荐
相关产品推荐

