Teradata / SQL连接数据转换

时间:2017-07-07 23:32:04

标签: sql casting teradata

这整个下午一直绞尽脑汁,我觉得我错过了一些明显的东西。提前致谢。

我有两个表,A和B.表A有一个名为A_id的列,它的类型为DECIMAL(16,0)。表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)

这不会产生任何错误,但不会返回任何结果。我知道它们与A_id和B_ids相同。

此外,下面的代码工作并返回良好的结果

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

如果我取出where子句,则sql将返回error message (2620),表明我的角色不好。同样,如果我不进行任何转换,sql将返回错误消息。我假设有某种隐式转换使第二块代码工作。

我真的需要有关如何使第一块代码工作的帮助。那么,如何正确cast A.A_id,这样连接才能真正起作用。

2 个答案:

答案 0 :(得分:0)

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'; 

它没有为你产生结果的原因可能是因为你在表B的id中插入了一个额外的,比方说空白字符,并且没有正确比较。 Id est:'12345'<>'12345'

答案 1 :(得分:0)

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

你的双重演员只会删除作为Decimal默认格式一部分的句点,并产生一个字符串' 12345'而不是' 12345。'。

显然,表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+

两者都为坏数据返回NULL,但不会失败。