0

我正在尝试从具有语言列的表中获取记录。如果存在具有特定语言代码(例如 US )的行,我想要这些行,但如果没有,我需要使用通配符语言代码(“*”)获取行。

这在一个查询中是否可行,而无需在查询后过滤结果?

我不认为它可以完成,但是任何可以在一个查询中以这种方式检索数据的想法都会受到赞赏。

4

3 回答 3

0

基本答案很简单;将 OR 语句的各个部分括在括号中。然后好好看看它是人们容易犯错误的地方之一——总是仔细检查你的括号:)

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

对不起 - 错过了这个要求,并编辑了我的答案来解决它。现在括号开始很重要......

于 2012-04-30T04:14:04.190 回答
0

如果您的数据库服务器是 SQL Server 200X、Oracle 或 MySQL,您可以union单独使用省略重复行的运算符:

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

操作员将union处理重复项,其中 asunion all还将返回重复项。我也相信与 OR 相比, union 的性能要好得多。

如需进一步阅读:

SQL Server: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

于 2012-04-30T05:28:03.320 回答
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'

然后在应用程序中检查字段是否存在,使用字段,否则使用 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'

(例如,查询未尝试)

于 2012-04-30T21:31:39.910 回答