【问题标题】:sql like clause with many values具有许多值的 sql like 子句
【发布时间】: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
  • 没有办法同时使用 INLIKE,这是有充分理由的:在你开始“需要”这两个运算符的时候,你已经达到了一个应该考虑其他选项(如@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。

标签: sql oracle sql-like


【解决方案1】:

你可以试试regexp_like函数

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      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%')
      

      【讨论】:

      • 我喜欢你的回答,但你不觉得清理任务有点过分吗?
      猜你喜欢
      • 2023-01-18
      • 2011-08-02
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多