如何在运行时在mysql查询中配置表

时间:2012-04-27 17:15:17

标签: mysql sql

人们知道我们可以使用if语句在select语句中配置查询,如

select if(var=1,amount,amount/2) from mytable;

但是,如果我想实现这样的目标,那该怎么办呢?

select amount from if(var=1,mytable1,mytable2);

有没有办法在运行时配置表?

3 个答案:

答案 0 :(得分:2)

SELECT amount FROM mytable1 WHERE @var = 1
UNION
SELECT amount FROM mytable2 WHERE @var = 0

UPD:以下是MySQL EXPLAIN对于条件评估为FALSE的查询部分的样子:

请注意Impossible WHERE部分。 MySQL认识到WHERE中的表达式一直在评估FALSE,因此它甚至不会尝试执行查询。因此,使用这种方法时没有性能开销。

答案 1 :(得分:1)

升级到答案

var来自哪里?

  1. 如果它是另一种语言的变量,您可以用其他语言测试它,然后根据需要构造不同的SQL:

    $sql = "SELECT amount FROM " . ($var = 1 ? "mytable1" : "mytable2");
    
  2. 如果它是SQL中的用户变量,您可以在两个替代SELECT语句周围使用IF statement

    DELIMITER ;;
    
    IF @var = 1 THEN
      SELECT amount FROM mytable1;
    ELSE
      SELECT amount FROM mytable2;
    END IF;;
    
    DELIMITER ;
    
  3. 如果它是其他任何东西(比如你桌子上的一个字段),那么你的问题没有多大意义。

答案 2 :(得分:0)

基于mysql手册页,看来你不能用传统的语法来做到这一点。

“用户变量旨在提供数据值。它们不能直接在SQL语句中用作标识符或标识符的一部分,例如在需要表或数据库名称的上下文中,或作为保留字比如SELECT。“ - [http://dev.mysql.com/doc/refman/5.6/en/user-variables.html] [1]

这个例外是你可以组装一个准备好的语句,但对于大多数编程任务来说可能不是更好的解决方案。最好将sql字符串生成保留为调用mysql的语言。

但是,如果您将此作为“仅限sql”任务的一部分,就像导入一样,这似乎是您必须采取的方法。

SET @s = CONCAT("SELECT * FROM ", if(true, "table1", "table2"), " LIMIT 1");
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SET @s = CONCAT("SELECT * FROM ", if(false, "table1", "table2"), " LIMIT 1");
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;