【问题标题】:Teradata / SQL join data conversionTeradata/SQL 连接数据转换
【发布时间】:2017-12-12 08:32:49
【问题描述】:

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

我有两个表,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 将返回错误消息。我假设正在进行某种隐式转换,使第二块代码工作。

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

【问题讨论】:

  • 我不明白问题是什么。您的最后一个查询似乎有效。所以,使用那个版本。
  • 我宁愿让第一块代码工作,从 A 中选择并加入 B。另外,正如我所提到的,当我删除 where 子句时,第二块代码将无法工作。跨度>

标签: sql casting teradata


【解决方案1】:
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'

【讨论】:

  • 感谢您的建议。我尝试在铸造前添加左修剪和右修剪。结果还是不行。
  • 那你能倒过来投吗? cast(B.b_id as decimal(16,0))
【解决方案2】:

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

您的双重转换只是删除了作为十进制默认格式的一部分的句点,并导致字符串“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,但不会失败。

【讨论】:

    猜你喜欢
    • 2020-05-19
    • 2020-09-24
    • 2016-10-06
    • 2020-09-21
    • 2016-02-06
    • 2011-12-31
    • 2019-09-06
    • 2020-01-21
    • 2017-11-24
    相关资源
    最近更新 更多