Teradata/SQL加入数据转换

Teradata / SQL join data conversion

整个下午我都在绞尽脑汁,感觉好像遗漏了一些明显的东西。提前致谢。

我有两个 table,A 和 B。Table A 有一个名为 A_id 的列,它的类型为 DECIMAL(16,0)。 Table B 有一个名为 B_id 的列,它的类型为 varchar(100)。我正在尝试内部联接,最好是从 A 到 B。之后,我还需要使用 where 子句过滤结果,例如 A = 12345。到目前为止,我已经尝试了以下内容。

select A.A_id, B.B_id 
from A 
join B on B.B_id = cast(cast(A.A_id as bigint) as archer(100))
where A_id = '12345'; 

(我也试过把A,A_id直接转成varchar)

这不会产生任何错误,但 return 没有结果。我知道它们是相同的 A_id 和 B_id。

此外,下面的代码有效并且return结果不错

select A.A_id, B.B_id 
from B 
join a on B.B_id = A.A_id
where B_id = '12345';

如果我把where从句去掉,那么sql就会returnerror message (2620)暗示我人品不好。同样,如果我不进行任何转换,sql 将显示 return 错误消息。我假设正在进行某种隐式转换,使第二段代码工作。

我真的需要有关如何使第一段代码正常工作的帮助。那么,如何正确地 cast A.A_id 以便连接真正起作用。

create table A
(
a_id decimal (16,0)
);

create table B
(
b_id varchar(10)
);

insert into A select 12345;
insert into B select '12345';

-- produces result
select A.a_id, B.b_id from A join B on a.a_id=b.b_id;

--produces the same result, although I don't understand the reason for intra-casting
select A.A_id, B.B_id from A 
  join B on B.B_id = cast(cast(A.A_id as bigint) as varchar(100))
where A_id = '12345'; 

它没有为您生成结果的原因可能是因为您在 table B 的 ID 中插入了一个额外的,比方说,空白字符,并且无法正确比较。 ID est: '12345'<>'12345'

当您比较数字值和字符值时,字符串将始终转换为 Float(这是最灵活的数字格式),请参阅 Implicit Type Convesions

您的双重转换只是删除了作为 Decimal 默认格式一部分的句点,并导致字符串“12345”而不是“12345”。

显然 table B 中有一些错误数据无法转换为数字,where B_id = '12345' 在转换前删除了这些数据。

当然,当您必须连接具有不同数据类型的两列时,这是一个错误的数据模型,效率较低并且统计数据会丢失。

作为解决方法,您可以应用

on TO_NUMBER(B.B_id) = A.A_id -- TD14+

on TRYCAST(B.B_id AS DECIMAL(16.0)) = A.A_id -- TD15.10+

两个 return NULL 表示错误数据,但不要失败。