2014-09-11 31 views
0

设置我想对在MySQL案例与结果在mysql中

SELECT result.* FROM 
(CASE WHEN (2 = 2) 
THEN 
(SELECT * FROM mytable WHERE myID =2814) 
END) result ; 

测试下面的查询,但它正在发送语法错误。 任何想法它有什么问题吗?

+1

你到底想达到什么目的? – Mureinik 2014-09-11 12:49:07

+0

你想要做什么?上面的查询不需要case语句。 – 2014-09-11 12:50:40

+0

我会做的是在不同的情况下,我会返回不同的表中不同的结果集。 首先,我只是想测试我是否可以返回基于大小写的结果集。 – 2014-09-11 12:52:33

回答

0

,你可以做一个四围的方式,像这样

SET @query := NULL; 

SELECT @query := t.qry 
FROM 
( SELECT 
     CASE WHEN 2 = 2 
      THEN "SELECT * FROM mytable WHERE myID =2814" 
      WHEN another_condition 
      THEN "another_select" 
     END as qry 
) t ; 

PREPARE query1 FROM @query; 
EXECUTE query1; 
0

这是一个评论太长。

显然,你的查询等效于:

SELECT * 
FROM mytable 
WHERE myID = 2814; 

这使得它有点难以找出你所要求的。

基本上,尽管case是一个表达式,并且from子句不接受表达式。它接受表名,视图名称,子查询等。其次,case声明还有其他一些问题。

  • 它返回一个标量标量值。子查询可能会返回多行。
  • 返回多个列是不允许
  • 所有条款需要返回同样的事情

如果你想从多个表中选择 - 和他们都具有相同的结构 - 你可以使用union all结构:

select t.* 
from table2 t 
where . . . 
union all 
select t.* 
from table2 t 
where . . . 
+0

这只是一个示例,我的真实查询在不同情况下会有所不同 – 2014-09-11 13:10:41

+0

@KamranShahid。 。 。也许你应该提出另一个问题,提供足够的细节来提供一个有用的答案(除非John提供的动态SQL为你工作)。不要编辑这个问题 - 对我们这些以当前形式回答它的人来说是不公平的。 – 2014-09-11 14:05:46

0

我宁愿每次(其中至少将使MySQL的使用索引正确的一些机会)使用不同的查询。

但是假设有,你作为根据检查数据源那么也许是这样想几个子查询: -

SELECT result.* 
FROM 
(
    SELECT * FROM mytable WHERE 2 = 2 AND myID = 2814 
    UNION 
    SELECT * FROM mytable2 WHERE 1 = 2 AND myID = 2814 
    UNION 
    SELECT * FROM mytable3 WHERE 3 = 2 AND myID = 2814 
) result ; 
+0

这个问题看起来像OP只想执行一个特定的查询,这可能会导致运行时问题 – 2014-09-12 02:30:16

+0

完全同意,但这就是你会动态地建立SQL来做。这个解决方案将以他目前想要的方式工作,并且考虑到大多数联合查询将带回任何应该相对高效的东西。下方是子查询的结果使用的任何where子句将不会使用任何索引。 – Kickstart 2014-09-12 08:04:23