我假设$x
是从你的 PHP 派生的,那么:
SELECT * FROM t WHERE IF($x=0, 1, id=$x)
(这是为了展示总体思路,您必须自己处理注射等)
编辑
我在这里的另一个答案中找到了不错的代码。所以我很好奇——哪个更快?现在我很高兴我的也是这样:
我的版本:
mysql> 选择@@版本;
+-----------+
| @@版本 |
+-----------+
| 5.5.27 |
+-----------+
一组中的 1 行(0.00 秒)
现在,测试数据:
mysql> 从测试中选择 *;
+----+-------+
| 编号 | 标题 |
+----+-------+
| 1 | f |
| 3 | 吨 |
| 4 | 小号 |
+----+-------+
3 行一组(0.02 秒)
和测试:
第一:IF比较
mysql>选择@x;
+------+
| @x |
+------+
| 吨 |
+------+
一组中的 1 行(0.00 秒)
mysql> select benchmark(1E7, if(@x=0, 1, title=@x)) from test;
+----------------------------------------------------+
| 基准(1E7,如果(@x=0,1,标题=@x))|
+----------------------------------------------------+
| 0 |
| 0 |
| 0 |
+----------------------------------------------------+
3 行一组(1.66 秒)
mysql> 设置@x=0;
查询正常,0 行受影响(0.00 秒)
mysql> select benchmark(1E7, if(@x=0, 1, title=@x)) from test;
+----------------------------------------------------+
| 基准(1E7,如果(@x=0,1,标题=@x))|
+----------------------------------------------------+
| 0 |
| 0 |
| 0 |
+----------------------------------------------------+
3 行一组(1.85 秒)
二、OR比较
mysql>选择@x;
+------+
| @x |
+------+
| 0 |
+------+
一组中的 1 行(0.00 秒)
mysql> 从测试中选择基准(1E7,标题 = @X 或 @X = 0);
+----------------------------------------+
| 基准(1E7,标题 = @X 或 @X = 0)|
+----------------------------------------+
| 0 |
| 0 |
| 0 |
+----------------------------------------+
3 行,65535 个警告(17.31 秒)
-好的,那是因为类型转换。定影:
mysql> 设置@x='0';
查询正常,0 行受影响(0.00 秒)
mysql> 从测试中选择基准(1E7,标题 = @X 或 @X = '0');
+--------------------------------------------------------+
| 基准(1E7,标题 = @X 或 @X = '0')|
+--------------------------------------------------------+
| 0 |
| 0 |
| 0 |
+--------------------------------------------------------+
一组 3 行(5.78 秒)
最后,非零:
mysql> 设置@x='t';
查询正常,0 行受影响(0.00 秒)
mysql> 从测试中选择基准(1E7,标题 = @X 或 @X = '0');
+--------------------------------------------------------+
| 基准(1E7,标题 = @X 或 @X = '0')|
+--------------------------------------------------------+
| 0 |
| 0 |
| 0 |
+--------------------------------------------------------+
3 行一组(4.92 秒)
结论
IF
在这种情况下,比较似乎比OR
(1E7 基准迭代大约 3 倍)快得多