首页 > 解决方案 > 标准 SQL 和 Teradata 强制转换语法之间的语义差异

问题描述

我试图了解以下两种语法之间的区别,它们在将字符串转换为整数时似乎在做同样的事情:

SELECT CAST('1' AS INTEGER), '1' (INTEGER)

导致:

|'1'|'1'|
|---|---|
|1  |1  |

但是他们在链接转换时不会做同样的事情:

SELECT CAST(CAST('1' AS INTEGER) AS VARCHAR(3)), ('1' (INTEGER)) (VARCHAR(3))

我现在得到:

|'1'|'1'|
|---|---|
|1  |   |

第二列包含一个空字符串,而不是 null。两种语法之间是否存在语义差异,或者这只是一个错误?

我正在使用版本 16.20.05.01

标签: sqlteradata

解决方案


正如评论中提到的(没有人想回答?),在“CAST 与 Teradata 转换语法有何不同”部分中记录了行为差异

具体来说:

使用 Teradata 转换语法(即不使用 CAST)将数字转换为字符数据需要谨慎。

过程如下:

  1. 使用数值的默认值或指定的 FORMAT 将数值转换为字符串。前导和尾随填充字符不会被修剪。

  2. 如果需要,使用填充字符向右延伸,或根据需要从右侧截断,以符合目标长度规范。如果非填充字符被截断,则不报告字符串截断错误。


推荐阅读