查询:
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_1
与subject_2
和subject_1
匹配。
示例:
TEST1
我应该可以在找到TEST2
匹配时获取一行。我不应该得到第二排,因为已经满足了第一个条件。
目前有了我的查询,我得到2行,其中要求只获得一行。
如果第一个条件失败,那么我应该检查第二个条件subject_2,如'%TEST2%'。
答案 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,则返回行,如果A
和B
为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
答案 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编写相同的查询。