下面的例子是 w.r.t MySQL。 例如:test1如下
+----+------------------------+
| id | name |
+----+------------------------+
| 2 | 1,2 |
| 33 | 2,44,33,5 |
| 1 | 11,4,55 |
| 12 | 11,111,122,551,112,221 |
+----+------------------------+
选择* 来自 test1 其中 find_in_set('122',name)
将 o/p 以下内容:
+----+------------------------+
| id | name |
+----+------------------------+
| 12 | 11,111,122,551,112,221 |
+----+------------------------+
在 Sql Lite 中,使用方式如下:
select *
from `test1`
where name like '%,122,%'
or name like '122,%'
or name like '%,122'
or name = '122'
A case:
我的值为 551,122。在这种情况下,当值从 appln 返回时,我们可以拆分值列并将查询写为
(',' || column_name || ',') LIKE '%,551,%' or
(',' || column_name || ',') LIKE '%,122,%'
有什么最好的办法来处理这个问题吗?
我想避免喜欢。那么还有其他想法吗?
请您参考如下方法:
我的第一个想法是,您不应该将 CSV 数据存储在关系数据库的列中,您应该使用单独的关联表。
不过,您可以使用 LIKE 来完成这项工作。您的评论表明您看到了三种情况,但实际上有四种情况:
select *
from test1
where name like '122,%'
or name like '%,122'
or name like '%,122,%'
or name = '122' /* You forgot about this degenerate case */
索引可用于最后一种情况,也可能用于第一种情况,但中间两种情况可能是表扫描。如果您强制数据始终具有前导和尾随逗号,则可以简化查询:
+----+--------------------------+
| id | name |
+----+--------------------------+
| 2 | ,1,2, |
| 33 | ,2,44,33,5, |
| 1 | ,11,4,55, |
| 12 | ,11,111,122,551,112,221, |
+----+--------------------------+
然后你可以只使用一个 LIKE(不会使用索引):
select *
from test1
where name like '%,122,%'
但您确实应该使用关联表,这样您就可以使用 where name = 122 并为其余部分连接到其他表。


