2012-10-18 58 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