如何在oracle中对逗号分隔值应用过滤器?

时间:2012-09-10 09:49:47

标签: sql oracle

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

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

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

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

我的查询是如何在这样的行上应用过滤器,其中value是以逗号分隔值的字符串。 请指导。

3 个答案:

答案 0 :(得分:4)

要搜索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。

答案 1 :(得分:1)

您可以使用以下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

答案 2 :(得分:0)

如果您正在寻找其中一个值: 使用LIKE:

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

使用REGEX:

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

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

使用REGEX:

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

编辑:  正则表达式更新