如何解决使用 SQL 查询从新列中的表中提取值
我在数据库中有一个带有文本列的表格,其中每行的记录都记录为列表,例如列test
:
[['a','1'],['b','2'],['c','3']]
[['a',['a','4'],'8'],['d','3']
[['b','3'],5'],'6'],'4']]
我想将值提取到三个新列 x y z
where
- x 包含 a 和 b 的所有值;
- y 包含 c 的所有值;
- z 包含 d 的所有值,例如
像这样:
x y z
['a','2'] ['c','3']
['a','4'] ['c','8'] ['d','3']
['b','3'] ['c','5'],'6'] ['d','4']
是否可以使用 SQL 语句执行此操作?
提前致谢
解决方法
您需要一个递归 CTE 来分割每一行,然后 GROUP_CONCAT() 根据您的要求收集值:
WITH cte AS (
SELECT rowid,SUBSTR(test,1,INSTR(test || ';',';') - 1) col,';') + 1) rest
FROM (SELECT rowid,REPLACE(REPLACE(REPLACE(test,'[[','['),']]',']'),'],[','];[') test FROM tablename)
UNION ALL
SELECT rowid,SUBSTR(rest,INSTR(rest || ';',';') - 1),';') + 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'] |
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。