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

时间:2014-06-17 08:15:58

标签: android sql sqlite

我想在SQLite数据库

中拆分逗号分隔的String

示例:我的表格中有一个Category列。

|Category                      |
|------------------------------|
|Auto,A,1234444                |
|Auto,B,2345444                |
|Electronincs,Computer,33443434|

我想从字符串上面只获取一个值。

value1: Auto
value2: A
value3: 1234444

我在Google上搜索过很多内容;我找到了一种使用Replace()Trim()替换逗号的方法。但是,我希望得到一种更简单的方法。

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

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

5 个答案:

答案 0 :(得分:19)

您可以使用公用表表达式在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!='';

输出符合预期:

Auto
A
1234444

答案 1 :(得分:0)

@ user1461607提供的答案的这种变化形式 确保保留所有碰巧为空字符串的CSV值:

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字符串数组。

答案 2 :(得分:0)

我喜欢@ user1461607的答案,除了:在我看来,SQLite文档警告不要在一般情况下以及在递归SELECT的特定情况下都假定SELECT发出任何特定顺序。在这里,我修改了该答案,以认为 SQLite保证可以正常工作的方式添加排序列。

我还从外观上将示例从逗号分隔的列表更改为路径,以建议在某些情况下您确实需要按特定顺序处理事物。此示例还打印了临时表中的所有列,因此更容易看到发生了什么。 AFAICT,SQLite中的CTE没有通常的ROWID列,因此看来您真的需要自己添加一些排序列才能在晚上睡个好觉。

export class ChildClass implements OnInit {
@Input()  propList: ISomeInterface[] = [] ; //add this 
@Input()  prop: ISomeInterface; 
@Output()  output: EventEmitter;

Constructor(){}
ngOnInit(){}

someMethod(prop: ISomeInterface){
let itemToAdd: any = { ... };
let index = this.propList.indexOf(prop);

this.propList.splice(index++, 0, itemToAdd);

this.output.emit();
}
}

答案 3 :(得分:0)

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

答案 4 :(得分:-6)

请在你的sqlite中创建这个函数,首先传递2个参数是分隔符和第二个字符串。

CREATE FUNCTION [dbo].[Split]
(   
      @Sep char(1)
    , @S varchar(512)
)
RETURNS TABLE 
AS
RETURN 
(
    WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@Sep, @S)
      UNION ALL
      SELECT pn + 1, stop + 1, CHARINDEX(@Sep, @S, stop + 1)
      FROM Pieces
      WHERE stop > 0
    )
    SELECT pn,
      SUBSTR(@S, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS S
    FROM Pieces
)