T-SQL 加入前导零的外键
T-SQL Join on foreign key that has leading zero
我需要 link 各种表,每个表都有一个公共键(在本例中为序列号)。在某些表中,键有一个前导零,例如'037443' 和其他人不是,例如'37443'。在这两种情况下,序列指的是同一产品。混淆序列 'numbers' 并不总是数字 例如可能是 "BDO1234",在这些情况下永远不会有前导零。
我更愿意使用 WHERE 语句 (WHERE a.key = b.key),但如果需要可以使用联接。有什么办法吗?
我还在学习,所以请尽可能简单。非常感谢。
您需要创建一个函数
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
如果两者都是数字,则将它们作为整数进行比较,否则将它们作为字符串进行比较。
基于此 link 中接受的答案,我编写了一个小的 tsql 示例来向您展示我的意思 'the right direction':
创建测试 table:
CREATE TABLE tblTempTest
(
keyCol varchar(20)
)
GO
填充它:
INSERT INTO tblTempTest VALUES
('1234'), ('01234'), ('10234'), ('0k234'), ('k2304'), ('00034')
Select 值:
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
请注意,这些值为 alpha-numeric,并且仅删除前导零。
一个可能的缺点是,如果在白色 space 之后有一个 0
,它将不会被修剪,但这是一个简单的修复 - 只需添加 ltrim
:
SUBSTRING(LTRIM(keyCol), PATINDEX('%[^0]%', LTRIM(keyCol + '.')), LEN(keyCol)) As trimmed
我需要 link 各种表,每个表都有一个公共键(在本例中为序列号)。在某些表中,键有一个前导零,例如'037443' 和其他人不是,例如'37443'。在这两种情况下,序列指的是同一产品。混淆序列 'numbers' 并不总是数字 例如可能是 "BDO1234",在这些情况下永远不会有前导零。
我更愿意使用 WHERE 语句 (WHERE a.key = b.key),但如果需要可以使用联接。有什么办法吗?
我还在学习,所以请尽可能简单。非常感谢。
您需要创建一个函数
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
如果两者都是数字,则将它们作为整数进行比较,否则将它们作为字符串进行比较。
基于此 link 中接受的答案,我编写了一个小的 tsql 示例来向您展示我的意思 'the right direction':
创建测试 table:
CREATE TABLE tblTempTest
(
keyCol varchar(20)
)
GO
填充它:
INSERT INTO tblTempTest VALUES
('1234'), ('01234'), ('10234'), ('0k234'), ('k2304'), ('00034')
Select 值:
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
请注意,这些值为 alpha-numeric,并且仅删除前导零。
一个可能的缺点是,如果在白色 space 之后有一个 0
,它将不会被修剪,但这是一个简单的修复 - 只需添加 ltrim
:
SUBSTRING(LTRIM(keyCol), PATINDEX('%[^0]%', LTRIM(keyCol + '.')), LEN(keyCol)) As trimmed