2013-07-25 62 views
1

這是一個奇怪的,我似乎無法包裹我的頭。MySQL條件/優先條件下

基本上我需要基於具有覆蓋的值進行搜索。所以有2列基本上是相同的內容。一個是自動更新的,一個是手動的。如果自動裝置不可用,它將使用手冊,如果手冊不可用,它將使用自動裝置。最後,如果兩者都可用,它將使用自動除非和「覆蓋」標誌被啓用(可能是第三列)。

我需要做的是基於該參數進行搜索,就好像它是一個字段一樣,使用列上的優先級集合。所以這裏是一個WHERE語句的例子,但我不知道什麼可能是正確的語法使用。

WHERE (isset(width)?(width_override?o_width:width):o_width) = {query} 
+0

你應該爲此使用一個存儲過程,它將允許你使用變量來存儲條件,這會比試圖在where子句中做到這一點更容易 – holaSenor

回答

2

使用IF函數。

WHERE IF(width IS NOT NULL, IF(width_override, o_width, width), 
          o_width) = {query} 
+0

這似乎給我帶來了錯誤,它與我對典型的if語句的知識不同,我不知道在哪裏查看來診斷它。 –

+0

@Reaction:在第一行結尾處只有一個逗號缺失。 IF()函數的語法很簡單:'IF(a,b,c)'。如果a是真的那麼返回b否則返回c。 Barmar嵌套了另一個IF表達式來代替'b'。 – spencer7593

+0

我明白了,我會研究一下,謝謝!有了這個編輯,立即工作,並增加了覆蓋,完美! –

2

我認爲你正在尋找COALESCE():

SELECT COALESCE(overridden_width_col, automatic_width_col) width 
    FROM yourtable 
WHERE COALESCE(overridden_width_col, automatic_width_col) = %param 

COALESCE()將返回第一個非空參數。 overridden_​​width_col設置爲NULL,它將使用automatic_width_col。

+0

越權列怎麼樣? – Barmar

+0

o_width是手動的,寬度是自動的。基本上一個值是由守護進程自動生成的,但爲了允許更多的控制,您可以使用o_width來覆蓋它,如果需要/ /如果自動的沒有設置。最後,width_override是強制它使用手動,無論。 –

+0

@Reaction對不起,從問題中不清楚我已經澄清了我的回答 – artfulrobot