【问题标题】:SQLite convert single row to multiple rowsSQLite 将单行转换为多行
【发布时间】:2021-01-12 13:52:25
【问题描述】:

SQLite
我想将由“,”分隔的单行值转换为多行

示例:

单行

6,7,8,9,10,11,12,13,14,15,16

结果必须是:

多行

6
7
8
9
10
12
13
14
15
16

我尝试用 substr 函数来做,但得到了意想不到的结果

select 
 numbers.n,
substr(CbahiHSSpecialtyUnits.units,numbers.n,1) 
from
  numbers inner join CbahiHSSpecialtyUnits
  on  LENGTH(CbahiHSSpecialtyUnits.units)
     - LENGTH(REPLACE(CbahiHSSpecialtyUnits.units, ',', ''))>=numbers.n-1
  WHERE HsSubStandardID=22 and SpecialtyID=2 and  numbers.n>0
  order by numbers.n;

一件好事是我得到了正确的行数。但是应该分开的值是错误的。 请注意,数字表是我在这篇文章的帮助下为索引目的而创建的。 SQL split values to multiple rows

【问题讨论】:

  • 看看你正在尝试做什么,这似乎是一个非常好的主意,似乎你可以为其他用户贡献对数据库设计的宝贵见解。我建议创建一个自我回答的问题,例如“为什么从列中的 CSV 更改为一对多关系设计?”。当然,假设那是您所做的/所做的。 (无意讽刺。如果您让我知道,您几乎可以保证在那里获得支持。)您甚至可以在此处链接为“我是如何在 SQLite 的帮助下做到的......”。
  • 是的 Yunnosh,我已经发布了解决方案

标签: sqlite android-sqlite


【解决方案1】:

您可以使用递归的CTE

WITH cte AS (
  SELECT SUBSTR(Units, 1, INSTR(Units || ',', ',') - 1) col,
         SUBSTR(Units, INSTR(Units || ',', ',') + 1) value
  FROM CbahiHSSpecialtyUnits
  WHERE HsSubStandardID=22 AND SpecialtyID = 2
  UNION ALL
  SELECT SUBSTR(value, 1, INSTR(value || ',', ',') - 1),
         SUBSTR(value, INSTR(value || ',', ',') + 1)
  FROM cte
  WHERE LENGTH(value) > 0
)
SELECT col 
FROM cte
WHERE col + 0 > 0

或者,如果你知道数字的上限是 20 并且数字之间没有重复:

WITH cte AS (SELECT 1 col UNION ALL SELECT col + 1 FROM cte WHERE col < 20)
SELECT c.col 
FROM cte c INNER JOIN CbahiHSSpecialtyUnits u
ON ',' || u.Units || ',' LIKE '%,' || c.col || ',%'
WHERE HsSubStandardID=22 AND SpecialtyID = 2

请参阅demo
结果:

col
6
7
8
9
10
11
12
13
14
15
16

【讨论】:

  • @Yunnosch 是的,我还不习惯新的表格格式。
  • 和我一样。其实,现在看到这张表,我已经不太确定“漂亮”了……不是你的错。
  • 我会将您的解决方案标记为已回答。但是我已经找到了解决方案。云诺什先生。但是您的解决方案是可以理解的。非常感谢您的宝贵时间。
【解决方案2】:

我找到了解决办法

http://www.samuelbosch.com/2018/02/split-into-rows-sqlite.html

WITH RECURSIVE split(predictorset_id, predictor_name, rest) AS (
  SELECT CbahiHSSpecialtyUnits.SpclUnitSerial, '', units || ',' FROM CbahiHSSpecialtyUnits WHERE HsSubStandardID=22 and SpecialtyID=2 
   UNION ALL
  SELECT predictorset_id, 
         substr(rest, 0, instr(rest, ',')),
         substr(rest, instr(rest, ',')+1)
    FROM split
   WHERE rest <> ''

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多