当我运行以下查询时,我得到 3 行而不是 4 行,
SELECT *
FROM freelook
WHERE done_type IN ('14','27','28')
因为在 1 行中的值是这样1,14,27
的。这是一列中逗号分隔的单个值。像这样,我有很多行有逗号分隔的值done_type
。
我希望它应该分隔值,然后检查它是否与给定值匹配。
我的查询是如何在值是逗号分隔值的字符串的此类行上应用过滤器。请指导。
例如,要搜索 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。
您可以使用以下 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
如果您正在寻找这些值之一:使用 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$')
编辑:正则表达式更新