【问题标题】:How to ignore a record in query to avoid a conversion error in JOIN?如何忽略查询中的记录以避免JOIN中的转换错误?
【发布时间】:2021-03-09 16:58:39
【问题描述】:

我有一个带有字母数字代码(varchar 列)的表 T1,其中前三个数字总是像这样的数字:

001ABCD
100EFGH
541XYZZ
OTHER

注意:请注意,我有一个异常记录,全是 alpha (OTHER)。

我还有一个带有 3 位数字(int 列)的表 T2,如下所示:

001
200
300

所以当我运行以下查询时:

SELECT * from T1
LEFT JOIN T2
ON SUBSTRING(T1.code1,1,3) = T2.code2
WHERE T1.code1 <> 'OTHER'

这导致了我的错误:

将 varchar 值“OTH”转换为数据类型 int 时转换失败。

我知道问题,但不知道如何解决(它试图将“OTH”与 T2.code2 INT 列进行比较)。 我尝试使用 WHERE,但它根本不起作用。

我无法摆脱“其他”记录并将 T2.code2 列从 int 转换为 varchar 不是一种选择。有什么想法吗?

【问题讨论】:

  • 您可以使用 try_convert 将子字符串包装在 where 子句中。所以它会像TRY_CONVERT(INT, SUBSTRING(T1.code1,1,3)) = T2.code2
  • 或者,您可以将 T2.code2 转换为 CHAR(3)。无论哪种方式都应该有效。
  • 另外,它不能是 3 位数字并且是 int 列。 001 不是整数。

标签: tsql join type-conversion


【解决方案1】:

这里有 3 种不同的方法可以解决这个问题。我会推荐持久化计算列,因为它只需要在插入和更新时计算,而不是每次运行读取查询时。

DROP TABLE IF EXISTS #T2;
DROP TABLE IF EXISTS #T1;

CREATE TABLE #T1
(
    Code1 VARCHAR(10)
    ,Code2Computed AS TRY_CONVERT(INT,SUBSTRING(Code1,1,3)) PERSISTED
)
;

CREATE TABLE #T2
(
    Code2 INT
)
;

INSERT INTO #T1
(Code1)
VALUES
('001ABCD')
,('100EFGH')
,('541XYZZ')
,('OTHER')
;

INSERT INTO #T2
(Code2)
VALUES
(001)
,(100)
,(200)
,(300)
,(541)
;

--Convert INT to 3 digit code
SELECT *
FROM #T1
    LEFT JOIN #T2
        ON SUBSTRING(#T1.Code1,1,3) = RIGHT(CONCAT('000',#T2.Code2),3)
;

--Convert 3 digit code to INT
SELECT *
FROM #T1
    LEFT JOIN #T2
        ON TRY_CONVERT(INT,SUBSTRING(#T1.Code1,1,3)) = #T2.Code2
;

--Use computed column
SELECT *
FROM #T1
    LEFT JOIN #T2
        ON #T1.Code2Computed = #T2.Code2
;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多