【问题标题】:TSQL - Joining two numeric fields but with different lengthsTSQL - 连接两个数字字段但长度不同
【发布时间】:2016-06-28 10:42:51
【问题描述】:

对不起,如果这是一个基本问题,但我无法在谷歌等上找到答案。

我有两个表:Table1,Table2

表 1 有一个字段“ACCOUNTNO”,它是一个 10 个字符的数字字段(例如:1122334455)

表 2 有一个字段“SUBACCNO”,它是一个 12 个字符的数字字段(例如:112233445501)

如您所见,SUBACCNO 与 ACCOUNTNO 相同,但末尾多了两位数字,范围为 01-99。

如果我想加入这两个表并且一直在尝试这样的事情:

SELECT *
FROM TABLE1
JOIN TABLE2
ON TABLE1.ACCOUNTNO = TABLE2.SUBACCNO
WHERE STR(SUBACCNO) LIKE '1122334455%%'

由于无法对数字数据执行通配符,我尝试将其转换为最后两个字符带有通配符的字符串。但是,这没有返回任何内容。

有人可以提供一些建议吗?谢谢!

【问题讨论】:

  • SUBACCNO的最后2位不应该用于比较吗?

标签: tsql join numeric variable-length


【解决方案1】:

加入SUBACCNO 列除以 100 怎么样:

SELECT *
FROM TABLE1
JOIN TABLE2
    ON TABLE1.ACCOUNTNO = TABLE2.SUBACCNO / 100

实际上,为了安全起见,您可能希望使用ROUND() 将商显式截断到小数点后零位:

SELECT *
FROM TABLE1
JOIN TABLE2
    ON ROUND(TABLE1.ACCOUNTNO, 0, 1) = ROUND(TABLE2.SUBACCNO / 100, 0, 1)

【讨论】:

  • 四舍五入似乎可以解决问题。感谢您的解决方案。
【解决方案2】:

你的加入不起作用..

试试这个,这不是 Sargable..如果你不能改变你的设计

SELECT *
FROM TABLE1
JOIN TABLE2
ON TABLE1.ACCOUNTNO = cast(substring(TABLE2.SUBACCNO,1,10) as bigint)

您还可以添加一个如下所示的计算列并将其编入索引以获得良好的性能,如果您经常使用这些类型的查询,我建议您这样做

create table yourtable
(
accno bigint,
accno1 as  cast(substring(accno,1,10) as bigint) persisted
)

现在您可以索引上面的列以获得良好的性能

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2011-12-12
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多