[英]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_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%'
获取一行, 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,则返回该行;如果A
和B
为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.