T-SQL加入具有前导零

时间:2016-01-26 10:04:17

标签: tsql join where leading-zero

我需要链接各个表,每个表都有一个公共密钥(在这种情况下是一个序列号)。在一些表中,密钥具有前导零,例如' 037443'而在其他人看来,它不是例如' 37443&#39 ;.在这两种情况下,序列都指的是同一产品。混淆连续数字' 并非总是只是数字,例如可能是" BDO​​1234",在这些情况下,永远不会有前导零。

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

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

2 个答案:

答案 0 :(得分:2)

基于此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

答案 1 :(得分:1)

您需要创建一个功能

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

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