【问题标题】:How to apply filter on comma separated values in oracle?如何在oracle中对逗号分隔值应用过滤器?
【发布时间】:2012-09-10 09:49:46
【问题描述】:

当我运行以下查询时,我得到 3 行而不是 4 行,

SELECT *
FROM freelook
WHERE done_type IN ('14','27','28')

因为在 1 行中的值是这样的 1,14,27。这是一列中逗号分隔的单个值。像这样,我有很多行有 done_type 的逗号分隔值。

我希望它应该分隔值,然后检查它是否与给定值匹配。

我的查询是如何在值是逗号分隔值的字符串的此类行上应用过滤器。 请指导。

【问题讨论】:

标签: sql oracle


【解决方案1】:

例如,要搜索 14,您可以:

...
WHERE
    done_type = '14'
    OR done_type LIKE '14,%'
    OR done_type LIKE '%,14'
    OR done_type LIKE '%,14,%'

冲洗并重复 27、28 和您要搜索的任何其他数字...

但是,这会执行得非常糟糕(全表扫描)。

与其把油漆涂在锈上,不如解决根本问题1,并通过拆分为两个表来规范化数据。


1违反了atomicity的原则,因此违反了1NF。

【讨论】:

    【解决方案2】:

    您可以使用以下 SQL(假设“id”是您的 PK 列)。

    WITH tokens as (
    SELECT distinct id, token
    FROM        
    (SELECT  
    id,
    SUBSTR (csv,
      INSTR (csv, ',', 1, LEVEL  ) + 1,
      INSTR (csv, ',', 1, LEVEL+1) - INSTR (csv, ',', 1, LEVEL) -1 
      ) AS token
    FROM (
      SELECT  id, ','||trim(done_type||',') csv FROM freelook) 
      CONNECT BY LEVEL <= LENGTH(csv)-LENGTH(REPLACE(csv,',',''))+1)
      WHERE token is not NULL)
    
    SELECT id FROM tokens
    WHERE token in ('14','27','28')
    ORDER BY id, token
    

    【讨论】:

    • 这当然是低效的,但如果你的表很大,你总是可以将标记化为一个 MV。
    【解决方案3】:

    如果您正在寻找这些值之一: 使用喜欢:

     SELECT *
    FROM freelook
    WHERE done_type LiKE '%14%'
    OR done_type LiKE '%27%'
    OR done_type LiKE '%28%'
    

    使用正则表达式:

     SELECT *
    FROM freelook
    WHERE REGEXP_LIKE(done_type, '[^14,|,14,|,14$|^27,|,27,|,27$|^28,|,28,|,28$|]')
    

    如果您正在寻找完全匹配:

    使用正则表达式:

     SELECT *
    FROM freelook
    WHERE REGEXP_LIKE(done_type, '^14,27,28$')
    

    编辑: 正则表达式更新

    【讨论】:

    • 我猜这将返回具有 114,127 之类的值的行,因为它有 14 和 27。?
    • 人们应该注意,前两个也可以找到任何嵌入了搜索代码的东西,例如 X14X
    • 正确也只是添加逗号:) 我认为如果你不确定哪个是你需要同时使用的第一个值:'14,',',14' 和 ',14,' :)
    • @HRgiger,实际上这也会返回41,这取决于开头或结尾是否有列...这应该是:(^|,)(14|27|28)($|,)
    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 2020-10-20
    • 2015-01-06
    • 2015-04-01
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多