2014-03-27 47 views
0

我需要按一列查找記錄,但如果沒有記錄,我需要通過另一列搜索,但第一列優先。如何指定WHERE子句的評估順序?

考慮的情景:

find records matching column_1 

if no records matching column_1, find records matching column_2 

if records matching column_1 found, find the subset which also match column_2 

如何構建這樣的查詢?

回答

1

這樣的查詢(嘗試查找具有特定條件的記錄, 。

這是您的標準:

  • 如果存在相匹配COLUMN_1和匹配COLUMN_2記錄,那麼只有這些顯示出來。
  • 如果存在匹配column_1且沒有匹配column_2的記錄,則不顯示任何內容。
  • 如果存在沒有記錄匹配COLUMN_1,那麼只顯示匹配COLUMN_2

在此更仔細地觀察記錄,它歸結爲:

  • 如果存在的記錄相匹配COLUMN_1,然後只顯示匹配column_ 1和COLUMN_2
  • 記錄,如果存在任何記錄相匹配的COLUMN_1,那麼只顯示匹配COLUMN_2
記錄

或:

  • 僅顯示具有匹配column_2的記錄。如果表中存在具有匹配的column_1的記錄,則過濾器以使column_1也必須匹配。

以下是該語句:

select * from mytable 
where column_2 = 'match2' 
and 
(
    column_1 = 'match1' 
    or 
    (select count(*) from mytable where column_1 = 'match1') = 0 
); 
+0

我試圖實現你的解決方案,但無法理解'select count(*)= 0'後面的邏輯。 – Dimt

+0

您使用匹配的column_1對錶中的記錄進行計數。然後,您將該值與零進行比較。 –

+0

是的,它按預期工作,謝謝。 – Dimt

1

你不關心where條款的部分順序 - 它們可以隨意互換,這是一件好事。

的usuall的方式做你的要求會使用or運營商什麼:

where column_1 = @param or column_2 = @param 

查詢不會讓你回到同一行兩次或更多次,它僅適用於過濾器,以每行一次(邏輯上)。

這三種情況應該有什麼區別?如果你想返回一些額外的狀態,您可以使用SELECT子句,例如像這樣:

select 
case when column_1 = @param then 'Matched first!' 
else 'Matched second!' end as Status 

如果你想做到這一點,你必須複製查詢三次,並使用union all加盟三個查詢的結果,例如。是這樣的:

select ... from ... 
where column_1 = @param 
union all 
select ... from ... 
where column_1 <> @param and column_2 = @param 

+0

這聽起來像一個計劃。沒有考慮過工會的概念。謝謝 – Dimt

+0

Dimt,UNION在你的情況下不起作用,因爲你*要*要一個結果集*或*另一個 - 取決於記錄匹配條件1是否存在。 UNION只能粘貼toether *兩個*結果集。 –

+0

@ThorstenKettner嗯,是的,你說得對。在這種情況下,最好的方法可能是使用'@@ ROW_COUNT'或表變量。 – Luaan

1

希望這有助於
從TableX的選擇,(SELECT COUNT(*)N從TableX的地方COLUMN1 = 「條件」)n,其中 (NN <> 0 and column2 =「condition」and column1 =「condition」)or(nn = 0 and column2 =「condition」)