我试图从一个有语言列的表中获取记录。如果有一行包含特定的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