我想在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()
。但是,这个函数可以设置最大长度来获取字符串值,而我的字符串值没有固定的长度。
答案 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;
假设已加载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
)