首页 > 解决方案 > SQL Server 2019:无法组合两个查询,当 1 解析字符串时

问题描述

有两个表(table1 和 table2)。

表 2 有一个名为的列TaskDescription,其中包含一个嵌入了多个“标签”的字符串。我无法更改该数据的存储方式,因为它来自第三方。我可以取出taskID

我想从表 1 中获取所有信息,其中 table1.id = 上述查询的结果。我的问题是第一个查询返回超过 1 行,因此出现错误。

SELECT *
FROM table1
WHERE table1.id = (SELECT 
                       CASE WHEN CHARINDEX(' ', a.em) <> 0 
                               THEN SUBSTRING(a.em, 1, CHARINDEX('</taskID>', a.em) - 1)
                            ELSE a.em 
                       END id
                   FROM 
                       (SELECT 
                            SUBSTRING(TaskDescription, CHARINDEX('<taskid>', TaskDescription) + 8, LEN(TaskDescription)) em
                        FROM table2
                        WHERE TaskDescription LIKE '%schemaupdate%') a
        )

标签: sqlsql-server

解决方案


当我们用于查找的限制查询的结果有超过 1 条记录,但我们想使用标量表达式(单值结果)时,我们有 4 个选项:

  1. 自行检查您的限制查询,它是否返回您期望的数据?
    • 你期待一个结果吗?
  2. 如果查找中的所有值都相同,则DISTINCT可以令人满意,它的性能低于下一个选项,但它允许您稍后在查询返回不同的值时检测到错误。
  3. 如果你不关心具体的值,或者你知道它们总是相同的值并且你不需要验证它,你可以返回TOP 1.
    • 确保ORDER BY在使用时设置适当的TOP
  4. 通过将 更改=IN运算符来更改要设置的查询

清楚的:

SELECT *
FROM table1
WHERE table1.id = (SELECT DISTINCT
                       CASE WHEN CHARINDEX(' ', a.em) <> 0 
                               THEN SUBSTRING(a.em, 1, CHARINDEX('</taskID>', a.em) - 1)
                            ELSE a.em 
                       END id
                   FROM 
                       (SELECT 
                            SUBSTRING(TaskDescription, CHARINDEX('<taskid>', TaskDescription) + 8, LEN(TaskDescription)) em
                        FROM table2
                        WHERE TaskDescription LIKE '%schemaupdate%') a
        )

前1名:

SELECT *
FROM table1
WHERE table1.id = (SELECT TOP 1
                       CASE WHEN CHARINDEX(' ', a.em) <> 0 
                               THEN SUBSTRING(a.em, 1, CHARINDEX('</taskID>', a.em) - 1)
                            ELSE a.em 
                       END id
                   FROM 
                       (SELECT 
                            SUBSTRING(TaskDescription, CHARINDEX('<taskid>', TaskDescription) + 8, LEN(TaskDescription)) em
                        FROM table2
                        WHERE TaskDescription LIKE '%schemaupdate%') a
        )

基于集合 (IN):

SELECT *
FROM table1
WHERE table1.id IN (SELECT 
                       CASE WHEN CHARINDEX(' ', a.em) <> 0 
                               THEN SUBSTRING(a.em, 1, CHARINDEX('</taskID>', a.em) - 1)
                            ELSE a.em 
                       END id
                   FROM 
                       (SELECT 
                            SUBSTRING(TaskDescription, CHARINDEX('<taskid>', TaskDescription) + 8, LEN(TaskDescription)) em
                        FROM table2
                        WHERE TaskDescription LIKE '%schemaupdate%') a
        )

推荐阅读