使用 SQL 查询从新列中的表中提取值

Posted

技术标签:

【中文标题】使用 SQL 查询从新列中的表中提取值【英文标题】:Extract value from table in new column with SQL query 【发布时间】:2021-05-19 06:54:42 【问题描述】:

我在数据库中有一个带有文本列的表,其中每一行的记录都记录为列表,例如专栏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 where

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 语句来做到这一点?

提前致谢

【问题讨论】:

用您正在使用的数据库标记您的问题。 【参考方案1】:

您需要一个递归 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']

【讨论】:

非常感谢!我只是为我纠正这个(测试,'[[','['),']]',']'),'],[','];[')。我在这个'],['之间添加了一个空格,对我来说效果很好。 @enzococca 在您的示例数据中我看不到,[ 之间的空格,但如果这样就可以了。 你说得对,但在我的真实数据中我有!再次感谢。最佳 只是一个问题,可以对 postgresql 进行相同的查询吗? @enzococca 因为它不是。语法不同:dbfiddle.uk/…

以上是关于使用 SQL 查询从新列中的表中提取值的主要内容,如果未能解决你的问题,请参考以下文章

如何增加(更新)SQL 表中的单元格?在查询中

SQL - 查询字符串是不是包含列中的部分值

SQL 查询将多条记录中的值组合到单个列中

如何从sql server中的表中查询json数组类型列的值?

SQL如何查询出某一列中不同值出现的次数?

sql根据一个字段不同值查询不同表中的一个字段