2012-04-30 30 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' 

(查询是例子,都没有尝试过)