如果第一个条件为 true,则停止从 SQL 查询的 where 子句中的其他条件获取



>Query:

where  (table1.subject_1 like '%TEST1%'  OR 
        table1.subject_1 like '%TEST2%'  OR 
        table1.subject_1 like '%TEST3%'  OR 
        table1.subject_1 like '%TEST4%'
       ) 
       OR 
       (table1.subject_2 like '%TEST1%'  OR 
        table1.subject_2 like '%TEST2%'  OR 
        table1.subject_2 like '%TEST3%'  OR 
        table1.subject_2 like '%TEST4%'
       )

在这里if subject_1 = TEST1则无需搜索其余条件,如果未找到,则搜索其他条件。

我需要一条记录,其中包含上述查询中的任何一个subject_1If subject_1与任何结果都不匹配,然后搜索subject_2

我的问题:从上面的查询中,返回了多个记录,其中subject_1 TEST1匹配并TEST2两者。

例:

no,  name,     add1,    occ,   date,   subject_1,subject_2,Exclusion_number        
-----------------------------------------------------------------------------
446 REBECCA   street1    Y    1/1/2001   TEST1   AB               10
446 REBECCA   street1    Y    1/1/2001   TEST2   A                11

我应该能够在找到匹配项时获取一行subject_1 like '%TEST1%'。我不应该得到第二行,因为第一个条件已经满足了。

目前使用我的查询,我得到 2 行,其中要求是只获取一行。

如果第一个条件失败,那么我应该检查第二个条件subject_2例如"%TEST2%"。

这将返回与任何条件匹配的第一行。

SELECT TOP 1 *
FROM TABLE1
where  
(table1.subject_1 like '%TEST1%' OR table1.subject_1 like '%TEST2%' OR 
table1.subject_1 like '%TEST3%' OR table1.subject_1 like '%TEST4%') OR 
(table1.subject_2 like '%TEST1%' OR table1.subject_2 like '%TEST2%' OR 
table1.subject_2 like '%TEST3%' OR table1.subject_2 like '%TEST4%')

> OR 是完全关联的,并且是短路的(给定A or B,如果A为真,则永远不会选中B(,因此您的括号不会执行任何操作,给定(A or B) or (C or D),如果A为真,则(A or B)自动为真,则整个表达式为真,并返回该行。

在像 A or B or C or D 这样的情况下,如果 A 为 true,则返回该行,如果 A 为 false 但B为 true,则返回该行,如果 AB 为假但C为真,则返回该行,依此类推。

希望有帮助。

编辑:

在某些情况下,查询优化器可能不选择短路 OR(因此,如果第二个谓词可能引发异常,有时可能会首先执行(:(另请参阅:SQL Server 中的 OR 运算符短路(,但对于 OP 的情况,关联属性仍确定表达式的计算。

您可能

希望根据成功的第一次比较来限制结果集。但是,正如在一些评论中已经说过的那样,除非有预定义的排序,否则您无法保证将首先评估并返回哪个条件。

因此,我想您可以根据优先级定义和分配顺序,然后使用ROWNUM = 1来匹配顺序中的第一行。

SELECT *
FROM (
    SELECT t.*
    FROM Table1 t
    ORDER BY CASE 
            WHEN subject_1 LIKE '%TEST1%'
                THEN 1
            WHEN subject_1 LIKE '%TEST2%'
                THEN 2
            WHEN subject_1 LIKE '%TEST3%'
                THEN 3
            END
        ,CASE 
            WHEN subject_2 LIKE '%TEST1%'
                THEN 4
            WHEN subject_2 LIKE '%TEST2%'
                THEN 5
            WHEN subject_2 LIKE '%TEST3%'
                THEN 6
            END
    )
WHERE rownum = 1

演示

在 where 子句中,您无法确定将首先评估哪个条件。我建议使用 WITH 查询和 UNION。您可以编写如下所示的查询:

WITH tableData as (
  SELECT * FROM table1
)
SELECT * FROM (
  SELECT tableData.*, 1 as priority from tableData where subject_1 like '%TEST1'
  UNION
  SELECT tableData.*, 2 as priority from tableData where subject_1 like '%TEST2'
) ORDER BY priority LIMIT 1

上面的查询将只返回一条subject_1像"%TEST1"匹配的记录。也可以为subject_2编写相同的查询。

最新更新