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