SQLITE中是否有除“LIKE”之外的“CONTAINS”函数版本?
我试图找出每一个数字在1到7之间的总数。但数据包含这些数字的不同组合。例如,1;2.3,7; 1、2、3等等。我想找出每个数字弹出的总次数。我本质上想要的是SQLite的代码,它是这样的:SQLITE中是否有除“LIKE”之外的“CONTAINS”函数版本?,sql,string,sqlite,csv,Sql,String,Sqlite,Csv,我试图找出每一个数字在1到7之间的总数。但数据包含这些数字的不同组合。例如,1;2.3,7; 1、2、3等等。我想找出每个数字弹出的总次数。我本质上想要的是SQLite的代码,它是这样的: select <fields>, count(*) from tablexyz where <field> contains '2' (and '3','4',... individually) 当我输入如“2%”之类的内容时,它只会给出所有以2开头的序列,但会否定以1开头但包含2的
select <fields>, count(*)
from tablexyz
where <field> contains '2' (and '3','4',... individually)
当我输入如“2%”之类的内容时,它只会给出所有以2开头的序列,但会否定以1开头但包含2的序列
任何帮助都将不胜感激
我想找出每个数字弹出的总次数
您的示例代码和您想要的解决方案并不完全一致。我能想到的最接近的是
with t (txt) as -- a sample record from your table
(select '1; 2; 3,7; 1,2,3'),
t2 (num) as -- a lookup table we can create for range of numbers 1-7
(select 1 union all
select 2 union all
select 3 union all
select 4 union all
select 5 union all
select 6 union all
select 7)
select t2.num, length(t.txt) - length(replace(t.txt,t2.num,'')) as num_occurence
from t2
left join t on t.txt like '%' || t2.num || '%'
输出
使用下面的解决方案,您可以构建一个包含数字1到7的表,然后将其连接到源数据表,以计数该行中是否出现数字,然后将其相加 查询
请提供示例源数据和您希望从该源数据获得的示例输出。您所说的包含是什么意思?这不是标准的SQL运算符。例如,在T-SQL中,它是一个自由文本搜索操作符,需要FTS索引来提供良好的性能。您可以使用“%2%”来查找任何位置包含2的字段。如果您需要一个运算符来分割数据并标识特定字段,那么您使用的设计是错误的。您应该创建一个单独的表来保存该数据。SQLite是一个嵌入式数据库,没有很多细节。它甚至没有类型,更不用说arraysAn embedded DB由您自己的应用程序运行。如果您试图做一些它不能有效处理的事情,那么与在代码中读取数据和解析数据相比,您最终会浪费时间。在这种情况下就是这样。SQLite无法索引这些值,因此必须扫描所有这些值。如果您只读取所有这些字符串并使用正则表达式来检查单个值,这会更好
+-----+---------------+
| num | num_occurence |
+-----+---------------+
| 1 | 2 |
| 2 | 2 |
| 3 | 2 |
| 4 | NULL |
| 5 | NULL |
| 6 | NULL |
| 7 | 1 |
+-----+---------------+
WITH
sample_data (nums)
AS
(SELECT '1,2,3,4,5,6'
UNION ALL
SELECT '3,4,5,6'
UNION ALL
SELECT '1,2,7,6'
UNION ALL
SELECT '6' ),
search_nums (search_num)
AS
(VALUES(1)
UNION ALL
SELECT search_num+1 FROM search_nums WHERE search_num<7)
select search_num, sum(count_of_num) from (
SELECT s.nums,
n.search_num,
case
instr(s.nums, n.search_num)
when 0 then 0
else 1
end as count_of_num
FROM sample_data s, search_nums n
) group by search_num;
search_num sum(count_of_num)
1 2
2 2
3 2
4 2
5 2
6 4
7 1