【问题标题】:T-SQL Join on foreign key that has leading zero具有前导零的外键上的 T-SQL 连接
【发布时间】:2016-05-02 20:43:08
【问题描述】:

我需要链接各种表,每个表都有一个公共键(在这种情况下是一个序列号)。在某些表中,键具有前导零,例如'037443' 和其他人没有,例如'37443'。在这两种情况下,序列均指同一产品。混淆序列“数字”并不总是只是数字,例如可能是“BDO1234”,在这些情况下,永远不会有前导零。

我更喜欢使用 WHERE 语句 (WHERE a.key = b.key),但如果需要也可以使用连接。有没有办法做到这一点?

我还在学习,所以请尽可能保持简单。非常感谢。

【问题讨论】:

  • This 不是您问题的答案,但应该引导您朝着正确的方向前进。
  • 谢谢,这促使我更新我的帖子,因为它不是那么简单,连续剧有时是字母数字,所以我需要删除零,如果它存在的话,如果这是有意义的?

标签: tsql join where leading-zero


【解决方案1】:

根据link 中接受的答案,我编写了一个小型 tsql 示例来向您展示我所说的“正确方向”是什么意思:

创建测试表:

CREATE TABLE tblTempTest
(
    keyCol varchar(20)
)
GO

填充它:

INSERT INTO tblTempTest VALUES
('1234'), ('01234'), ('10234'), ('0k234'), ('k2304'), ('00034')

选择值:

SELECT  keyCol, 
        SUBSTRING(keyCol, PATINDEX('%[^0]%', keyCol + '.'), LEN(keyCol)) As trimmed
FROM tblTempTest

结果:

keyCol               trimmed
-------------------- --------------------
1234                 1234
01234                1234
10234                10234
0k234                k234
k2304                k2304
00034                34

清理:

DROP TABLE tblTempTest

请注意,这些值是字母数字,只有前导零被修剪。
一个可能的缺点是,如果在空格后面有 0,它将不会被修剪,但这是一个简单的修复 - 只需添加 ltrim

SUBSTRING(LTRIM(keyCol), PATINDEX('%[^0]%', LTRIM(keyCol + '.')), LEN(keyCol)) As trimmed

【讨论】:

    【解决方案2】:

    你需要创建一个函数

    CREATE FUNCTION CompareSerialNumbers(@SerialA varchar(max), @SerialB varchar(max))
    RETURNS bit
    
    AS
    
    BEGIN
        DECLARE @ReturnValue AS bit
        IF (ISNUMERIC(@SerialA) = 1 AND ISNUMERIC(@SerialB) = 1)    
        SELECT @ReturnValue = 
            CASE
                WHEN CAST(@SerialA AS int) = CAST(@SerialB AS int) THEN 1
                ELSE 0
            END
        ELSE
            SELECT @ReturnValue = 
            CASE
                WHEN @SerialA = @SerialB THEN 1
                ELSE 0
        END
        RETURN @ReturnValue
    END;
    GO
    

    如果两者都是数字,则将它们作为整数进行比较,否则将它们作为字符串进行比较。

    【讨论】:

    • 谢谢,但它们也可以是字母数字。我可以以某种方式测试一个 int 然后使用 CASE 语句来转换是否为真?
    • 答案替换为检查两种类型的函数
    • 谢谢你,一个工具包:)
    猜你喜欢
    • 1970-01-01
    • 2013-07-16
    • 2012-12-09
    • 1970-01-01
    • 2012-10-03
    • 2012-09-17
    • 2010-11-04
    • 2011-05-13
    • 1970-01-01
    相关资源
    最近更新 更多