如何拆分逗号分隔值?

问题描述 投票:0回答:6

我想在

Category
列中拆分一个以逗号分隔的字符串:

类别
汽车,A,1234444
汽车,B,2345444
电子、计算机、33443434

我只想从上面的字符串中获取一个值:

value1: Auto
value2: A
value3: 1234444

我找到了如何使用

Replace()
Trim()
。但是,我想要一种更简单的方法。在 SQL 中有
SubString()
但在 SQLite 中没有。
substr()
可以设置最大长度,但我的字符串没有固定长度。

sql sqlite
6个回答
48
投票

您可以使用通用表表达式在 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

8
投票

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


5
投票

我喜欢 @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;



2
投票

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 数组

假设 JSON1 扩展已加载,您可以在最后一行使用

json_group_array(value)

进行转换 将 CSV 转换为 JSON 字符串数组。

    


1
投票

SELECT split_part(category, ',', 3) FROM ...

https://github.com/nalgeon/sqlean/blob/main/docs/text.md#split_partsource-sep-part


0
投票

.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

	
© www.soinside.com 2019 - 2024. All rights reserved.