人们知道我们可以使用if语句在select语句中配置查询,如
select if(var=1,amount,amount/2) from mytable;
但是,如果我想实现这样的目标,那该怎么办呢?
select amount from if(var=1,mytable1,mytable2);
有没有办法在运行时配置表?
答案 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
来自哪里?
如果它是另一种语言的变量,您可以用其他语言测试它,然后根据需要构造不同的SQL:
$sql = "SELECT amount FROM " . ($var = 1 ? "mytable1" : "mytable2");
如果它是SQL中的用户变量,您可以在两个替代SELECT
语句周围使用IF
statement:
DELIMITER ;;
IF @var = 1 THEN
SELECT amount FROM mytable1;
ELSE
SELECT amount FROM mytable2;
END IF;;
DELIMITER ;
如果它是其他任何东西(比如你桌子上的一个字段),那么你的问题没有多大意义。
答案 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;