调用不同SELECT语句的MySQL IF / CASE语法

时间:2013-10-16 10:00:20

标签: mysql

我在使用MySQL IFCASE语法

时遇到问题

程序如下:

我有一个调用MySQL查询的PHP项目,假设PHP传递变量X

如果X不是0,那么它应该执行类似以下的查询:

SELECT * FROM table
WHERE id = X

但如果X0。那么它应该执行一个查询来只选择所有记录:

SELECT * FROM table

我不希望PHP中的条件根据PHP中的条件结果调用不同的MySQL查询。我希望基于传递X的变量在SQL查询中执行if / else条件。

2 个答案:

答案 0 :(得分:3)

SELECT * FROM table
WHERE $x = 0 or id = $x

答案 1 :(得分:1)

我认为$x来自您的PHP,然后:

SELECT * FROM t WHERE IF($x=0, 1, id=$x)

(这是显示一般的想法,你必须自己处理注射)

修改

我在另一个答案中找到了很好的代码。所以我很好奇 - 哪个更快?现在我很高兴我的也是这样:

我的版本:

mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 5.5.27    |
+-----------+
1 row in set (0.00 sec)

现在,测试数据:

mysql> select * from test;
+----+-------+
| id | title |
+----+-------+
|  1 | f     |
|  3 | t     |
|  4 | s     |
+----+-------+
3 rows in set (0.02 sec)

测试:

首先:IF比较

mysql> select @x;
+------+
| @x   |
+------+
| t    |
+------+
1 row in set (0.00 sec)

mysql> select benchmark(1E7, if(@x=0, 1, title=@x)) from test;
+---------------------------------------+
| benchmark(1E7, if(@x=0, 1, title=@x)) |
+---------------------------------------+
|                                     0 |
|                                     0 |
|                                     0 |
+---------------------------------------+
3 rows in set (1.66 sec)

mysql> set @x=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select benchmark(1E7, if(@x=0, 1, title=@x)) from test;
+---------------------------------------+
| benchmark(1E7, if(@x=0, 1, title=@x)) |
+---------------------------------------+
|                                     0 |
|                                     0 |
|                                     0 |
+---------------------------------------+
3 rows in set (1.85 sec)

二,OR比较

mysql> select @x;
+------+
| @x   |
+------+
|    0 |
+------+
1 row in set (0.00 sec)

mysql> select benchmark(1E7, title = @X or @X = 0) from test;
+--------------------------------------+
| benchmark(1E7, title = @X or @X = 0) |
+--------------------------------------+
|                                    0 |
|                                    0 |
|                                    0 |
+--------------------------------------+
3 rows in set, 65535 warnings (17.31 sec)

-ok,这是因为类型转换。固定:

mysql> set @x='0';
Query OK, 0 rows affected (0.00 sec)

mysql> select benchmark(1E7, title = @X or @X = '0') from test;
+----------------------------------------+
| benchmark(1E7, title = @X or @X = '0') |
+----------------------------------------+
|                                      0 |
|                                      0 |
|                                      0 |
+----------------------------------------+
3 rows in set (5.78 sec)

最后,非零:

mysql> set @x='t';
Query OK, 0 rows affected (0.00 sec)

mysql> select benchmark(1E7, title = @X or @X = '0') from test;
+----------------------------------------+
| benchmark(1E7, title = @X or @X = '0') |
+----------------------------------------+
|                                      0 |
|                                      0 |
|                                      0 |
+----------------------------------------+
3 rows in set (4.92 sec)

<强>结论

在这种情况下,

IF比较似乎比OR(1E7基准迭代约为3倍)更快