我在使用MySQL IF
或CASE
语法
程序如下:
我有一个调用MySQL查询的PHP项目,假设PHP传递变量X
。
如果X
不是0
,那么它应该执行类似以下的查询:
SELECT * FROM table
WHERE id = X
但如果X
是0
。那么它应该执行一个查询来只选择所有记录:
SELECT * FROM table
我不希望PHP中的条件根据PHP中的条件结果调用不同的MySQL查询。我希望基于传递X
的变量在SQL查询中执行if / else条件。
答案 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倍)更快