2012-10-18 59 views
4

我在我的表中有4列。现在,由于这更多的是数据清理任务,所以我对性能并没有特别的关注。但我仍然想知道可能的选择。SQL like clause with many values

看看下面的查询:

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') 
+0

你看全文搜索? [MySQL全文搜索](http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html) – SidewaysGravity

+1

没有办法同时使用'IN'和'LIKE',并且有充分的理由:在你开始“需要”这两个操作符的时候,你已经达到了应该考虑其他选项的地步(比如全文搜索,就像@SidewaysGravity建议的那样)。在查询中有太多的LIKE操作会很慢。 – ean5533

+0

我知道你是对的。我一直在看regexp_like从句。你怎么看待这件事? – Bytekoder

回答

0

你可以尝试写一个存储过程,用“DEP”的一部分作为参数输入。 然后只是连接所有存储过程调用的结果。

0
CREATE VIEW VW_dsopi_person_addr_rule 
AS 
    SELECT Primary_key 
     , src_address_line1 AS src_address_line 
    FROM dsopi_person_addr_rule 
    UNION 
    SELECT Primary_key 
     , src_address_line2 
    FROM dsopi_person_addr_rule 
    UNION 
    SELECT Primary_key 
     , src_address_line3 
    FROM dsopi_person_addr_rule 
    SELECT Primary_key 
     , src_address_line4 
    FROM dsopi_person_addr_rule 

DELETE FROM VW_dsopi_person_addr_rule 
    WHERE Primary_key in (SELECT Primary_key 
          FROM VW_dsopi_person_addr_rule 
         WHERE src_address_line like '%DEP%) 

DELETE D1 FROM VW_dsopi_person_addr_rule D1 
    WHERE EXISTS (SELECT 1 
        FROM VW_dsopi_person_addr_rule V1 
       WHERE V1.Primary_key_value1 = D1.Primary_key_value1 
        AND V1.Primary_key_value2 = D1.Primary_key_value2 
        AND V1.src_address_line like '%DEP%') 
+0

我喜欢你的答案,但你不觉得它有点过度工作的清理任务? – Bytekoder