簡體   English   中英

使用 SQL 查詢從新列中的表中提取值

[英]Extract value from table in new column with SQL query

我在數據庫中有一個帶有文本列的表,其中每一行的記錄都記錄為列表,例如列test

[['a','1'],['b','2'],['c','3']]
[['a','2'],['a','4'],['c','8'],['d','3']
[['b','3'],['c',5'],['c','6'],['d','4']]

我想將值提取到三個新列xyz

  • 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

請參閱演示
結果:

X 是的 z
['a','1'],['b','2'] ['c','3'] null
['a','2'],['a','4'] ['c','8'] ['d','3']
['b','3'] ['c',5'],['c','6'] ['d','4']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM