我想在
Category
列中拆分一个以逗号分隔的字符串:
类别 |
---|
汽车,A,1234444 |
汽车,B,2345444 |
电子、计算机、33443434 |
我只想从上面的字符串中获取一个值:
value1: Auto
value2: A
value3: 1234444
我找到了如何使用
Replace()
和 Trim()
。但是,我想要一种更简单的方法。在 SQL 中有 SubString()
但在 SQLite 中没有。 substr()
可以设置最大长度,但我的字符串没有固定长度。
您可以使用通用表表达式在 SQLite 中拆分逗号分隔值。
WITH split(word, csv) AS (
-- 'initial query' (see SQLite docs linked above)
SELECT
-- in final WHERE, we filter raw csv (1st row) and terminal ',' (last row)
'',
-- here you can SELECT FROM e.g. another table: col_name||',' FROM X
'Auto,A,1234444'||',' -- terminate with ',' indicating csv ending
-- 'recursive query'
UNION ALL SELECT
substr(csv, 0, instr(csv, ',')), -- each word contains text up to next ','
substr(csv, instr(csv, ',') + 1) -- next recursion parses csv after this ','
FROM split -- recurse
WHERE csv != '' -- break recursion once no more csv words exist
) SELECT word FROM split
WHERE word!=''; -- filter out 1st/last rows
输出符合预期:
Auto
A
1234444
SQLite 提供了用于此目的的函数,例如获取子字符串
substr('your string', start_position, end_position)
,获取字符串中特定字符的位置 instr('22:string', ':')
,以及获取字符串 length('string')
的长度。
现在让我们看看以下示例:
select substr('22:khan', x, y);
returns a string starting at x and ends with y;
select substr('22:khan', 0, instr('22:khan',':'));
returns: 22
select substr('22:khan', instr('22:khan',':')+1, length('22:khan'));
returns: khan
select substr('22:khan',instr('22:khan',':'), length('22:khan'));
returns: :khan
select substr('Noor,Khan', 0, instr('Noor,Khan', ','));
returns: Noor
select substr('Noor,Khan', instr('Noor,Khan', ',')+1, length('Noor,Khan'));
returns: Khan
了解更多信息,请访问:https://www.sqlite.org/lang_corefunc.html
我喜欢 @user1461607 的答案,除了:在我看来,SQLite 文档警告不要从 SELECT 中假设任何特定顺序,无论是在一般情况下,还是在递归 SELECT 的特定情况下。在这里,我修改了该答案,以我认为 SQLite 保证工作的方式添加排序列。 我还将示例从逗号分隔的列表更改为路径,以表明在某些情况下您确实需要按特定顺序处理事物。此示例还打印出临时表中的所有列,因此更容易看到发生了什么。 AFAICT,SQLite 中的 CTE 没有通常的 ROWID 列,因此看起来确实需要自己添加一些排序列才能在晚上睡个好觉。
WITH RECURSIVE split(seq, word, str) AS (
SELECT 0, '/', 'home/ronburk/layers/branch'||'/'
UNION ALL SELECT
seq+1,
substr(str, 0, instr(str, '/')),
substr(str, instr(str, '/')+1)
FROM split WHERE str != ''
) SELECT * FROM split ORDER BY split.seq ASC;
WITH RECURSIVE split(value, str) AS (
SELECT null, 'Auto,A,1234444' || ',' -- the string to be split
UNION ALL
SELECT
substr(str, 0, instr(str, ',')),
substr(str, instr(str, ',')+1)
FROM split WHERE str!=''
) SELECT value FROM split WHERE value is not NULL;
将 CSV 行转换为 JSON 数组
json_group_array(value)
进行转换 将 CSV 转换为 JSON 字符串数组。
.mode col
create table category as select * from(values
('Auto,A,1234444'),
('Auto,B,2345444'),
('Electronics,Computer,33443434'));
select c->>0 c1,c->>1 c2,c->>2 c3 from
(select '['''||replace(column1,',',''',''')||''']'c from category);
-- output
c1 c2 c3
----------- -------- --------
Auto A 1234444
Auto B 2345444
Electronics Computer 33443434