0

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

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

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

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

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

4

3 回答 3

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违反原子性原则,因此违反 1NF。

于 2012-09-10T10:03:31.513 回答
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
于 2012-09-10T12:58:43.103 回答
0

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

 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$')

编辑:正则表达式更新

于 2012-09-10T09:59:12.957 回答