在SQLWorkbench/J中使用Teradata的CONCAT函数报错求助
搞定Teradata SQL在SQLWorkbench/J里的CONCAT语法报错问题
嘿,我帮你排查了下,你的SQL语句其实有两个关键问题,导致在SQLWorkbench/J里跑失败,而SQL Assistant因为容错性高没报错:
- 字段列表漏了逗号:你写的
CONCAT(...) as name3 variable4 as name4这里,name3和variable4之间少了个逗号!这会让数据库解析的时候彻底懵掉,虽然SQL Assistant可能睁一只眼闭一只眼,但JDBC驱动对语法要求更严,直接触发报错。 - Teradata的CONCAT函数有坑:Teradata原生的
CONCAT只支持两个参数,你现在传了三个(TRIM后的variable3、冒号、TRIM后的variable4),这在标准SQL里没问题,但Teradata默认模式下不认多参数的CONCAT。
给你两个靠谱的解决办法:
办法1:用Teradata原生的||连接符(最稳妥)
这个是Teradata一直支持的写法,兼容性拉满,直接把CONCAT换成||就行,同时补上漏掉的逗号,去掉FROM前面多余的逗号:
SELECT variable1 as name1, variable2 as name2, TRIM(variable3) || ':' || TRIM(variable4) as name3, variable4 as name4 FROM table1 WHERE variable4 between '2017-01-01' AND '2017-01-31';
办法2:开启ANSI模式用多参数CONCAT
如果你就想用CONCAT函数,那得先给当前会话开ANSI模式(需要你的Teradata版本在14.10及以上),然后再跑查询:
-- 先执行这个开启ANSI模式 SET SESSION SQL_MODE = 'ANSI'; SELECT variable1 as name1, variable2 as name2, CONCAT(TRIM(variable3), ':', TRIM(variable4)) as name3, variable4 as name4 FROM table1 WHERE variable4 between '2017-01-01' AND '2017-01-31';
另外提一句,你原语句里variable4 as name4后面还多了个逗号,这个也得删掉,不然也会报错哦。
至于为什么SQL Assistant能跑?那是因为它的语法解析器对小的语法不规范容忍度更高,而SQLWorkbench/J搭配Teradata JDBC驱动是严格按ANSI SQL规则来的,所以这些小问题就被揪出来了。
内容的提问来源于stack exchange,提问作者Nate Givens
相关产品推荐
相关产品推荐

