繁体   English   中英

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

[英]If first condition is true then stop fetching from the other conditions in where clause of a SQL 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_1的记录。 If subject_1与任何结果都不匹配,则搜索subject_2

我的问题:从上述查询中,返回多个记录,其中subject_1TEST1TEST2都匹配。

例:

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%'获取一行, 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为false,但C为true,则该行为返回等

希望能有所帮助。

编辑:

在某些情况下,查询优化器可能不会选择短路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

演示版

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM