ここで 3 つのこと:
- まず、
UNION使えるなら避けるUNION ALL。Plainunionは重複の削除を伴うため、より多くの時間がかかります。
- クエリを因数分解できる場合は、それを実行します。ここでは、1 つの基準を除いて正確なクエリの結合があり、使用できます
OR。
select * from (select * ...冗長性であり、回避できます。
これにより、次のことが得られます。
SELECT *
FROM y
WHERE x = 't'
AND ( z RLIKE '(.*)query1'
OR
z RLIKE '(.*)query2'
)
melpomene のコメントで述べたように (ありがとう!)、正規表現レベルで因数分解することもできます。
WHERE z RLIKE '(.*)query1|(.*)query2'
重複がyあり、それらが不要な場合はUNION、それらを破棄したため、導入できますが、DISTINCT必要がなければ回避できます。
注文が必要な場合は、DBMS に頼らないでください。使用ORDER BY:
ORDER BY CASE WHEN z RLIKE '(.*)query1' THEN 1
WHEN z RLIKE '(.*)query2' THEN 2
ELSE 3 -- given the WHERE clause, should never happen
END