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

时间:2018-03-20 01:14:08

标签: sql oracle case sql-like

查询:

UPDATE Market
SET Active = 1
WHERE MarketID IN
(
    SELECT value
    FROM OPENJSON('{"Comments": "test", "Markets": [3, 151]}','$.Markets')
);

此处value则无需搜索剩余条件,如果未找到,则搜索其他条件。

我需要上述查询中包含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_1subject_2subject_1匹配。

示例:

TEST1

我应该可以在找到TEST2匹配时获取一行。我不应该得到第二排,因为已经满足了第一个条件。

目前有了我的查询,我得到2行,其中要求只获得一行。

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

4 个答案:

答案 0 :(得分:0)

这将返回符合任何条件的第一行。

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%')

答案 1 :(得分:0)

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为真,则返回行,如果A为false但B为true,则返回行,如果AB为false,但C为真,返回行等等。

希望有所帮助。

编辑:

在某些情况下,查询优化器可能不会选择OR的短路(因此如果第二个谓词可能会抛出异常,有时可能会先执行):(另请参阅:OR Operator Short-circuit in SQL Server),但对于OP的情况下,关联属性仍然决定了表达式的评估。

答案 2 :(得分:0)

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

所以,我想您可以根据您的优先级定义和分配订单,然后使用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

Demo

答案 3 :(得分:0)

在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

上面的查询将仅返回一条与'%TEST1'这样的subject_1匹配的记录。也可以为subject_2编写相同的查询。