【发布时间】:2012-10-18 19:43:23
【问题描述】:
我的表中有 4 列。现在,由于这更像是一项数据清理任务,所以我对性能并不是那么特别。但我仍然想知道可能的选择。
看下面的查询:
SELECT * FROM dsopi_person_addr_rule ADDR WHERE
addr.src_address_line1 LIKE '%DEP%'
OR addr.src_address_line2 LIKE '%DEP%'
OR addr.src_address_line3 LIKE '%DEP%'
OR addr.src_address_line4 LIKE '%DEP%';
与 DEP 类似,我还有 10 场比赛。我需要为所有 4 个地址行重复每个匹配项。有更好的方法吗?我个人讨厌一次又一次地写作。
**更新:以下是答案
SELECT *
FROM dsopi_person_addr_rule ADDR
WHERE regexp_like (UPPER(addr.src_address_line1), 'DEP|DPT$|ABT|DIP.|DIPART|AFDEL|AVDEL|AVD.|DIV|PGRD|PGP|PPG')
【问题讨论】:
-
你看过全文搜索吗? MySQL Full Text Search
-
没有办法同时使用
IN和LIKE,这是有充分理由的:在你开始“需要”这两个运算符的时候,你已经达到了一个应该考虑其他选项(如@SidewaysGravity 建议的全文搜索)。一个查询中有太多的LIKE操作会非常慢。 -
我知道你是对的。我一直在看 regexp_like 子句。你怎么看?
-
我肯定会使用
REGEXP_LIKE()和连接(不是因为它会更快,只是为了让事情更简洁):WHERE REGEXP_LIKE(addr.src_address_line1 || addr.src_address_line2 || addr.src_address_line3 || addr.src_address_line4, '(DEP|OTH1|OTH2|OTH3)') -
@SidewaysGravity,OP 使用的是 Oracle 而不是 MySQL。