下面的例子是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)
任何最好的想法来处理这个?
我想避免喜欢.那么还有其他想法吗?
我的第一个想法是你不应该将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并连接到其他表了.
| 归档时间: |
|
| 查看次数: |
3523 次 |
| 最近记录: |