2012-04-30 36 views
0

我試圖從一個有語言列的表中獲取記錄。如果有一行包含特定的lang代碼(例如US),我想要這些行,但如果沒有,我需要使用通配符lang代碼(「*」)獲取行。MySQL或條件

這是可以在一個查詢中進行查詢而不過濾結果嗎?

我不認爲它可以完成,但任何想法將在一個查詢中以這種方式檢索數據將不勝感激。

+0

發佈表架構,以及到目前爲止所寫的查詢。 – tuxuday

回答

0

基本的答案很簡單;將OR語句的各個部分包裝在括號中。再好好看看,因爲人們容易犯錯誤的地方它的一個 - 總是仔細檢查您的括號:)

where (column = 'US' 
    or (column = '*' 
     and not exists (select 'x' from table where column = 'US'))) 

抱歉 - 錯過了要求,並已經編輯我的答案來解決它。現在括號開始重要...

+0

感謝您的回覆,但這將返回美國和*行?如果他們在那裏,我只需要美國行。 – drorpheus

0

如果你的數據庫服務器是SQL Server的200X,甲骨文或MySQL,你可以單獨使用其中的union運營商忽略重複行:

select a, b from table where column = 'US' 
union 
select a, b from table where column = '*' 

union操作會照顧重複,如union all也將返回重複。另外我相信工會在OR方面的表現要好得多。

有關此進一步閱讀:

SQL服務器:http://msdn.microsoft.com/en-us/library/ms180026.aspx

甲骨文:http://docs.oracle.com/cd/B12037_01/server.101/b10759/queries004.htm

的MySQL:http://dev.mysql.com/doc/refman/5.1/en/union.html

+0

假設a和b的值對於不同的語言有所不同,這將返回US和*的行,這不是OP所要的。 –

0

嘗試自聯接

SELECT a.*, b.field as field_original FROM `table` a 
LEFT JOIN `table` b ON (a.id = b.id AND b.lang = '*') 
WHERE a.lang = 'US' 

,然後在APPLI陽離子檢查,如果字段存在,利用場,否則使用field_original(你也可以添加在select case語句總是隻選擇其中一個值)

SELECT CASE a.field IS NULL THEN b.field ELSE a.field END 
FROM `table` a 
LEFT JOIN `table` b ON (a.id = b.id AND b.lang = '*') 
WHERE a.lang = 'US' 

(查詢是例子,都沒有嘗試過)