Skip to main content
 首页 » 编程设计

sql之sqlite 中与 MySQL 中的 find_in_set(value,set) 等效的函数是什么

2025年12月25日71dudu

下面的例子是 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 并为其余部分连接到其他表。