$x
私はあなたのPHPから派生していると仮定します:
SELECT * FROM t WHERE IF($x=0, 1, id=$x)
(これは一般的な考え方を示すためのものであり、インジェクションなどを自分で処理する必要があります)
編集
ここで別の回答で素敵なコードを見つけました。だから私は興味がありました-どちらが速いですか? 今、私もそれが「幸せ」です:
私のバージョン:
mysql> @@バージョンを選択;
+---------+
| | @@バージョン |
+---------+
| | 5.5.27 |
+---------+
セットで 1 行 (0.00 秒)
次に、データをテストします。
mysql> select * from test;
+----+---------+
| | ID | タイトル |
+----+---------+
| | 1 | ふ |
| | 3 | t |
| | 4 | s |
+----+---------+
3行セット (0.02秒)
そしてテスト:
最初: IF 比較
mysql> @x を選択します。
+--------+
| | @x |
+--------+
| | t |
+--------+
セットで 1 行 (0.00 秒)
mysql> テストからベンチマーク(1E7, if(@x=0, 1, title=@x)) を選択;
+-----------------------------------------------------+
| | ベンチマーク(1E7, if(@x=0, 1, title=@x)) |
+-----------------------------------------------------+
| | 0 |
| | 0 |
| | 0 |
+-----------------------------------------------------+
3 行セット (1.66 秒)
mysql> @x=0 を設定します。
クエリ OK、影響を受ける行は 0 (0.00 秒)
mysql> テストからベンチマーク(1E7, if(@x=0, 1, title=@x)) を選択;
+-----------------------------------------------------+
| | ベンチマーク(1E7, if(@x=0, 1, title=@x)) |
+-----------------------------------------------------+
| | 0 |
| | 0 |
| | 0 |
+-----------------------------------------------------+
3 行セット (1.85 秒)
2番目、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' を設定します。
クエリ OK、影響を受ける行は 0 (0.00 秒)
mysql> テストからベンチマーク (1E7、タイトル = @X または @X = '0') を選択します。
+----------------------------------------+
| | ベンチマーク (1E7、タイトル = @X または @X = '0') |
+----------------------------------------+
| | 0 |
| | 0 |
| | 0 |
+----------------------------------------+
3 行セット (5.78 秒)
そして最後に、非ゼロ:
mysql> @x='t' を設定します。
クエリ OK、影響を受ける行は 0 (0.00 秒)
mysql> テストからベンチマーク (1E7、タイトル = @X または @X = '0') を選択します。
+----------------------------------------+
| | ベンチマーク (1E7、タイトル = @X または @X = '0') |
+----------------------------------------+
| | 0 |
| | 0 |
| | 0 |
+----------------------------------------+
3 行セット (4.92 秒)
結論
IF
OR
この場合の比較は、 (1E7 ベンチマークの反復で約 3 倍)よりもはるかに高速であるように思われます。