簡體   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