【问题标题】:How write this join criteria in sql?如何在sql中编写此连接条件?
【发布时间】:2020-10-02 16:31:53
【问题描述】:

我的 column_x 包含 20 位或 22 位数字,column_Y 包含 22 位数字。

如果 column_x 的数字是 20 位长,我想加入 column_Y,只有 column_Y 中第二个数字不等于 0 的数字。 否则(当column_x号码为22位时),我想正常加入column_x和column_Y的号码。

如何做到这一点?

例如,

如果列x具有数字00000000000579701673(20位数)和0000000000095782131313(22位数),并且列y有数字9900000000000579701673(22位)和0000000000000957821317(22位数)(22位数),我想从Column_x加入00000000000579701673(20位数)来自 column_Y 的 9900000000000579701673(22 位)和来自 column_x 的 0000000000000957821317(22 位)和来自 column_Y 的 0000000000000957821317(22 位)

如果 column_X 是 20 位数字,则前缀是从 '01' 到 '99' 的任意位置 我正在使用 teradata sql 辅助

【问题讨论】:

  • 那么如果 X 是 20 位数字需要附加 99 前缀吗?
  • @June7 如果 20 位前缀是从 '01' 到 '99' 的任意位置,谢谢!
  • 请通过编辑而非 cmets 进行澄清。请展示你能做什么。 How to Askhelp centerminimal reproducible example
  • @philipxy 完成,谢谢!
  • 如果 X 列有 22 位,前两位是否总是相同的 00?那么连接将只是on right(column_x, 20)= right(column_y, 20),实际上忽略了前两个字符。

标签: sql join conditional-statements teradata criteria


【解决方案1】:

根据您的逻辑,如果字符串只有 20 个字符,您只需添加 '99'(类似于 June7 的答案,但使用标准 SQL/Teradata 语法):

join ...
on case when char_length(column_x) = 20 then '99' else '' end || column_x = column_y

编辑:

根据您的评论如果 X 有 20 位数字,则它必须与以“01”或“99”开头的 Y 列连接这可能是您想要的:

on right(column_x, 20)= right(column_y, 20)
and (char_length(column_x) = 22 
     or substr(column_y, 1, 2) <> '00')

【讨论】:

  • 不幸的是,它并不总是“99”
【解决方案2】:

这就是我认为您正在寻找的内容,并且我在两个连接条件上添加了 cmets 来解释我的理解。如果我误解了什么,请告诉我。我从未使用过 teradata SQL,因此您可能需要将我对 LEN 的使用更改为 LENGTH。

select * 
from x
inner join y
-- if X is 22 characters long, join with y normally
ON (LEN(x.id) = 22 AND x.id = y.id)
-- if x is 20 characters long, join with y if the first two digits are not 00
   OR (LEN(x.id) = 20 AND LEFT(y.id, 2) <> '00')

【讨论】:

    猜你喜欢
    • 2010-12-23
    • 2022-09-29
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 2020-07-25
    • 2016-10-25
    相关资源
    最近更新 更多