SQL WHERE有条件但没有CASE语句

时间:2013-06-15 12:07:25

标签: mysql sql select where

我必须使用给定的数据库。

我找到了这篇文章,但没有成功地根据我的需要进行调整:

http://weblogs.sqlteam.com/jeffs/archive/2003/11/14/513.aspx

我想做什么

我使用MYSQL 5和PHP 5.4。

数据库具有与单行相同主题的本地化条目。

表格的结构

+---+--------+------------+--------+----+-----+  
|id |a       |b           |c       |d   |e    |  
+---+--------+------------+--------+----+-----+  
|1  |aaa     |German text |booked  |0   |1    |  
+---+--------+------------+--------+----+-----+  
|2  |aaa     |English text|booked  |1   |0.25 |  
+---+--------+------------+--------+----+-----+  
|3  |aaa     |French text |booked  |2   |1    |  
+---+--------+------------+--------+----+-----+  
|4  |bbb     |German text |free    |0   |-0.25|  
+---+--------+------------+--------+----+-----+  
|5  |bbb     |French text |booked  |2   |1    |  
+---+--------+------------+--------+----+-----+  
|6  |ccc     |German text |free    |0   |-0.25|  
+---+--------+------------+--------+----+-----+  
|7  |ccc     |English text|free    |1   |0.5  |  
+---+--------+------------+--------+----+-----+  
|8  |ddd     |German text |free    |0   |-0.25|  
+---+--------+------------+--------+----+-----+  
|9  |ddd     |Russian text|booked  |5   |0.9  |  
+---+--------+------------+--------+----+-----+  
|10 |eee     |Italian text|free    |4   |1.2  |  
+---+--------+------------+--------+----+-----+  
|11 |eee     |English text|free    |1   |0.3  |  
+---+--------+------------+--------+----+-----+  

列:

a = subject  
b = localized text  
c = value  
d = language-key  
e = value  

我最多有三种不同的语言值来检查“d”列:

  • request_value(首选,如果为TRUE,则取主题1的这一行)
  • fallback_value(如果request_value失败,请检查此项,如果TRUE取主题1的这一行)
  • default_value(如果request_value和fallback_value失败,请检查此项,如果TRUE取主题1的这一行)
  • 如果所有三次检查都失败,则不返回subject1的行。

应该只返回所有subject1条目中的一行或不返回。

请求示例

request_value = 0 (German)  
fallback_value = 1 (English)  
default_value = 0 (German)  

should return rows id = 1, 4, 6, 8, 11  


request_value = 1 (English)  
fallback_value = 1 (English)  
default_value = 0 (German)  

should return rows id = 2, 4, 7, 8, 11  


request_value = 5 (Russian)  
fallback_value = 1 (English)  
default_value = 0 (German)  

should return rows id = 2, 4, 7, 9, 11  

我想到了WHERE语句中的一个条件,并且想要避免使用CASE语句。

查询(原型设计):

SELECT a, b  
FROM table  
WHERE  
c = value1  
AND (check conditions for d)  
AND e > 0  

请问,是否有人可以给我WHERE声明,即使有CASE声明,如果这是不可避免的?

是否有更好(或更快)的方法来过滤表格?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

您尝试做的与文章的内容大不相同:本文教授如何在没有case语句的情况下在单行上重写条件;另一方面,您的任务需要必须跨多行工作的条件。换句话说,文章的条件是水平,而您正在寻找垂直

构建选择单行的查询的一种方法是使用COALESCE。假设table有一个名为id的主键,您可以这样做:

-- Change these values as needed
SET @request_value = 5;
SET @fallback_value = 1;
SET @default_value = 0;

SELECT id
FROM test a
WHERE id = COALESCE (
  (SELECT ID FROM test b WHERE a.a=b.a AND d=@request_value)
, (SELECT ID FROM test b WHERE a.a=b.a AND d=@fallback_value)
, (SELECT ID FROM test b WHERE a.a=b.a AND d=@default_value)
)

这是demo on sqlfiddle

请注意,要使其正常工作,每个SELECT个人最多只能返回一行。在您的情况下,{a, d}的任意组合必须不超过一行。