如何在SQLite中拆分逗号分隔值?

dip*_*ali 9 sql sqlite android

我想String在SQLite数据库中拆分逗号分隔

示例:我的表中有一Category列.

|Category                      |
|------------------------------|
|Auto,A,1234444                |
|Auto,B,2345444                |
|Electronincs,Computer,33443434|
Run Code Online (Sandbox Code Playgroud)

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

value1: Auto
value2: A
value3: 1234444
Run Code Online (Sandbox Code Playgroud)

我在Google上搜索了很多; 我发现了一种使用Replace()和替换逗号的方法Trim().但是,我想要一个更简单的方法.

在SQL中,提供了SubString().但在SQLite中,没有这样的功能.怎么解决?

编辑:我已经检查过了substr().但是,这个函数可以设置最大长度来获取字符串值,而我的字符串值没有固定长度.

use*_*607 20

您可以使用公用表表达式在SQLite中拆分逗号分隔值.

WITH split(word, str) AS (
    -- alternatively put your query here
    -- SELECT '', category||',' FROM categories
    SELECT '', 'Auto,A,1234444'||','
    UNION ALL SELECT
    substr(str, 0, instr(str, ',')),
    substr(str, instr(str, ',')+1)
    FROM split WHERE str!=''
) SELECT word FROM split WHERE word!='';
Run Code Online (Sandbox Code Playgroud)

输出符合预期:

Auto
A
1234444
Run Code Online (Sandbox Code Playgroud)


Noo*_*han 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
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息,请访问: https: //www.sqlite.org/lang_corefunc.html


Ron*_*urk 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;
Run Code Online (Sandbox Code Playgroud)