我試圖從一個有語言列的表中獲取記錄。如果有一行包含特定的lang代碼(例如US),我想要這些行,但如果沒有,我需要使用通配符lang代碼(「*」)獲取行。MySQL或條件
這是可以在一個查詢中進行查詢而不過濾結果嗎?
我不認爲它可以完成,但任何想法將在一個查詢中以這種方式檢索數據將不勝感激。
我試圖從一個有語言列的表中獲取記錄。如果有一行包含特定的lang代碼(例如US),我想要這些行,但如果沒有,我需要使用通配符lang代碼(「*」)獲取行。MySQL或條件
這是可以在一個查詢中進行查詢而不過濾結果嗎?
我不認爲它可以完成,但任何想法將在一個查詢中以這種方式檢索數據將不勝感激。
基本的答案很簡單;將OR語句的各個部分包裝在括號中。再好好看看,因爲人們容易犯錯誤的地方它的一個 - 總是仔細檢查您的括號:)
where (column = 'US'
or (column = '*'
and not exists (select 'x' from table where column = 'US')))
抱歉 - 錯過了要求,並已經編輯我的答案來解決它。現在括號開始重要...
感謝您的回覆,但這將返回美國和*行?如果他們在那裏,我只需要美國行。 – drorpheus
如果你的數據庫服務器是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
假設a和b的值對於不同的語言有所不同,這將返回US和*的行,這不是OP所要的。 –
嘗試自聯接
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'
(查詢是例子,都沒有嘗試過)
發佈表架構,以及到目前爲止所寫的查詢。 – tuxuday