使用 SQL 查询从新列的 table 中提取值
Extract value from table in new column with SQL query
我有一个 table 数据库中有一个文本列,其中每一行的记录都记录为列表,例如列 test
:
[['a','1'],['b','2'],['c','3']]
[['a','2'],['a','4'],['c','8'],['d','3']
[['b','3'],['c',5'],['c','6'],['d','4']]
我想将值提取到三个新列中 x y z
其中
- x包含a和b的所有值;
- y 包含 c 的所有值;
- z 包含 d 的所有值,例如
像这样:
x y z
['a','1'],['b','2'] ['c','3']
['a','2'],['a','4'] ['c','8'] ['d','3']
['b','3'] ['c','5'],['c','6'] ['d','4']
是否可以使用 SQL 语句来做到这一点?
提前致谢
您需要一个递归 CTE 来拆分每一行,然后 GROUP_CONCAT() 以根据您的要求收集值:
WITH cte AS (
SELECT rowid,
SUBSTR(test, 1, INSTR(test || ';', ';') - 1) col,
SUBSTR(test, INSTR(test || ';', ';') + 1) rest
FROM (SELECT rowid, REPLACE(REPLACE(REPLACE(test, '[[', '['), ']]', ']'), '],[', '];[') test FROM tablename)
UNION ALL
SELECT rowid,
SUBSTR(rest, 1, INSTR(rest || ';', ';') - 1),
SUBSTR(rest, INSTR(rest || ';', ';') + 1)
FROM cte
WHERE LENGTH(rest) > 0
)
SELECT GROUP_CONCAT(CASE WHEN col LIKE '[''a'',%' OR col LIKE '[''b'',%' THEN col END) x,
GROUP_CONCAT(CASE WHEN col LIKE '[''c'',%' THEN col END) y,
GROUP_CONCAT(CASE WHEN col LIKE '[''d'',%' THEN col END) z
FROM cte
GROUP BY rowid
参见demo。
结果:
x
y
z
['a','1'],['b','2']
['c','3']
null
['a','2'],['a','4']
['c','8']
['d','3']
['b','3']
['c',5'],['c','6']
['d','4']
我有一个 table 数据库中有一个文本列,其中每一行的记录都记录为列表,例如列 test
:
[['a','1'],['b','2'],['c','3']]
[['a','2'],['a','4'],['c','8'],['d','3']
[['b','3'],['c',5'],['c','6'],['d','4']]
我想将值提取到三个新列中 x y z
其中
- x包含a和b的所有值;
- y 包含 c 的所有值;
- z 包含 d 的所有值,例如
像这样:
x y z
['a','1'],['b','2'] ['c','3']
['a','2'],['a','4'] ['c','8'] ['d','3']
['b','3'] ['c','5'],['c','6'] ['d','4']
是否可以使用 SQL 语句来做到这一点?
提前致谢
您需要一个递归 CTE 来拆分每一行,然后 GROUP_CONCAT() 以根据您的要求收集值:
WITH cte AS (
SELECT rowid,
SUBSTR(test, 1, INSTR(test || ';', ';') - 1) col,
SUBSTR(test, INSTR(test || ';', ';') + 1) rest
FROM (SELECT rowid, REPLACE(REPLACE(REPLACE(test, '[[', '['), ']]', ']'), '],[', '];[') test FROM tablename)
UNION ALL
SELECT rowid,
SUBSTR(rest, 1, INSTR(rest || ';', ';') - 1),
SUBSTR(rest, INSTR(rest || ';', ';') + 1)
FROM cte
WHERE LENGTH(rest) > 0
)
SELECT GROUP_CONCAT(CASE WHEN col LIKE '[''a'',%' OR col LIKE '[''b'',%' THEN col END) x,
GROUP_CONCAT(CASE WHEN col LIKE '[''c'',%' THEN col END) y,
GROUP_CONCAT(CASE WHEN col LIKE '[''d'',%' THEN col END) z
FROM cte
GROUP BY rowid
参见demo。
结果:
x | y | z |
---|---|---|
['a','1'],['b','2'] | ['c','3'] | null |
['a','2'],['a','4'] | ['c','8'] | ['d','3'] |
['b','3'] | ['c',5'],['c','6'] | ['d','4'] |