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 表示错误数据,但不要失败。
整个下午我都在绞尽脑汁,感觉好像遗漏了一些明显的东西。提前致谢。
我有两个 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 表示错误数据,但不要失败。