【问题标题】:Teradata - joining char with varcharTeradata - 将 char 与 varchar 连接
【发布时间】:2017-07-11 08:58:25
【问题描述】:

我有两个表 A 和 B。我想在 A.col_1 = B.col_2 上加入 A 和 B。 col_1 的数据类型为 VARCHAR(35),而 col_2 的数据类型为 CHAR(35)。以下语句在连接两个表时出现问题:没有返回记录,这意味着两个表无法连接。 col_1 通常有 8 - 11 位数字,与 col_2 相同。我的理解是即使我使用了“LENGTH(B.col_2)-1”,但只要 col_1 和 col_2 的值相同,尾随空格应该不会有问题。

是什么导致了这个问题?

ON A.col_1 =SUBSTR(B.col_2 ,1,LENGTH(B.col_2 )-1)

谢谢!

【问题讨论】:

  • 天睿没有修剪功能吗?
  • 嗨,丹,是的,Teradata 确实有修剪,这是我最初的解决方案,它有效。但我的问题是,既然加入时尾随空格无关紧要,为什么要修剪尾随空格是解决方案?我做出了改变,但当我回头看时,我很好奇。
  • 我还没有走到最后,但我在 Teradata 中发现A = B 在 A 和 B 相同但尾随空格除外时导致错误的情况......我可能会提出一天的问题。我完全无法创建一个简单的最小可重现场景:-(也许也链接到 tmode=ANSI/TERA ...?

标签: sql join teradata sqldatatypes


【解决方案1】:

我猜 B 是字符。 这将向您解释这里发生了什么:

select char_length(cast('abc' as char(10)));

10

您的 substr 不采用 char 字符串的实际长度,而是采用填充长度,因此您得到的原始字符串减去 1 个空格。

为了解决问题使用 -

SUBSTR(B.col_2 ,1,LENGTH(cast(B.col_2 as varchar(35))-1)

SUBSTR(B.col_2 ,1,LENGTH(rtrim(B.col_2)-1)

...是的,char/varchar 比较不重要

select 1 where cast('abc' as varchar(10)) = cast('abc' as char(10))

1

【讨论】:

  • 感谢您的快速回复,非常感谢。因此,我进行了 char2hexint 检查,例如,对于一条记录,col_1 为“3535363130393031”,第二列为“35353631303930313520202020202020202020202020202020202020202020202020”。这是什么意思?谢谢!
  • 你看了吗?
  • 嗨 Dudu,我有与您建议的相同的解决方案。但我的问题是:因为在加入 char 和 varchar 时,只要值相等,尾随空格就无关紧要了。因此,即使长度不相等,它们也应该能够相互连接。还有其他可能导致此问题的原因吗?
  • 我在回答中进行了解释。假设你有'ABC'(varchar)和'ABC '(char)。您不是要“按原样”进行比较-您想忽略最后一个字符。问题是你实际上在做什么,从第一个开始'AB',但从第二个开始'ABC '(少1个空间)。原因是 char(35) 上的 char_length 将始终返回 35。
猜你喜欢
  • 2016-06-26
  • 2018-06-16
  • 2020-07-04
  • 2020-03-15
  • 2015-10-22
  • 1970-01-01
  • 2018-06-04
  • 2012-01-04
  • 2018-02-09
相关资源
最近更新 更多