0

2 つのテーブルを結合したいが、「?」で始まる名前を除外したい。(実際には「?」を含むものはすべてありますが、違反者はすべて「?」で始まります。)

SELECT NAME, AGE, LOCATION 
FROM TABLEONE
WHERE NAME NOT LIKE CONCAT('?%')
UNION ALL
SELECT NAME, AGE, LOCATION 
FROM TABLETWO
WHERE NAME NOT LIKE CONCAT('?%')
LOCK IN SHARE MODE;

これは本当に遅いです。より良いクエリやインデックスを使用して高速化できますか?

これは私が継承したコードであるため、連結を使用しています。concat は最良の選択ではないと思いますが、受け取ったコードをそのまま示したいと思いました。

私の理解では、ワイルドカード検索ではインデックスは役に立ちません。

ありがとう!

4

2 に答える 2

0

同じために REGEXP を使用します。

SELECT NAME, AGE, LOCATION FROM TABLEONE WHERE NAME REGEXP '^([^?])'
UNION ALL
SELECT NAME, AGE, LOCATION FROM TABLETWO WHERE NAME REGEXP '^([^?])'
于 2013-04-18T15:06:51.347 に答える
0

名前が ? で始まるすべてのエントリに何か特別なものがある場合は、それらにフラグを付けるためにデータベースに別のフィールドを作成する必要があります。名前を使用するだけでは、このような問題が発生し、処理が遅くなります。

于 2013-04-18T15:17:12.857 に答える