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

Ang*_*dar 2 sql sqlite

下面的例子是wrt MySQL.例如:test1如下

+----+------------------------+
| id | name                   |
+----+------------------------+
|  2 | 1,2                    |
| 33 | 2,44,33,5              |
|  1 | 11,4,55                |
| 12 | 11,111,122,551,112,221 |
+----+------------------------+
Run Code Online (Sandbox Code Playgroud)

select*from test1 where find_in_set('122',name)

o/p以下内容:

+----+------------------------+
| id | name                   |
+----+------------------------+
| 12 | 11,111,122,551,112,221 |
+----+------------------------+
Run Code Online (Sandbox Code Playgroud)

在Sql Lite中,使用它会是:

select * 
from `test1` 
where name like '%,122,%'
or name like '122,%'
or name like '%,122'
or name = '122'
Run Code Online (Sandbox Code Playgroud)

一件事:

我的价值是551,122.在这种情况下,当从appln返回值时,我们可以拆分值列并将查询写为

(',' || column_name || ',') LIKE '%,551,%' or
(',' || column_name || ',') LIKE '%,122,%'
Run Code Online (Sandbox Code Playgroud)

任何最好的想法来处理这个?

我想避免喜欢.那么还有其他想法吗?

mu *_*ort 5

我的第一个想法是你不应该将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 */
Run Code Online (Sandbox Code Playgroud)

索引可用于最后一种情况,也可能用于第一种情况,但中间两种情况可能是表扫描.如果强制数据始终具有前导和尾随逗号,则可以简化查询:

+----+--------------------------+
| id | name                     |
+----+--------------------------+
|  2 | ,1,2,                    |
| 33 | ,2,44,33,5,              |
|  1 | ,11,4,55,                |
| 12 | ,11,111,122,551,112,221, |
+----+--------------------------+
Run Code Online (Sandbox Code Playgroud)

然后你只能使用一个LIKE(不会使用索引):

select *
from test1
where name like '%,122,%'
Run Code Online (Sandbox Code Playgroud)

但是你真的应该使用一个关联表,这样你就可以使用where name = 122并连接到其他表了.

  • +1`不应该将CSV数据存储在关系数据库的列中.为什么要通过存储为CSV来节省表中的空间? (2认同)