SQLite:为 SQLite 表中的重复条目添加后缀

问题描述 投票:0回答:1

我在向 SQLite 表中的重复条目添加后缀时遇到问题。这是场景: 我有这张桌子...

id  created_at  updated_at  scene_id
--  ----------  ----------  ---------
1   2024-02-13  2024-03-05  VT-1105
2   2024-02-14  2024-03-06  KA-338
3   2024-02-15  2024-03-07  JU-182
4   2024-02-16  2024-03-08  PX-118
5   2024-02-17  2024-03-09  PO-6339085
6   2024-02-18  2024-03-10  LA-426
7   2024-03-03  2024-03-06  KA-338
8   2024-03-03  2024-03-06  KA-338
9   2024-03-03  2024-03-06  KA-338
10  2024-03-04  2024-03-07  JU-182
11  2024-03-04  2024-03-07  JU-182
12  2024-03-04  2024-03-07  JU-182
13  2024-03-04  2024-03-07  JU-182
14  2024-03-05  2024-03-07  PX-118
15  2024-03-05  2024-03-07  PX-118

...我想在 SQLite 的底行上附加重复的场景名称,并带有 A、B、C 等,如下所示:

id  created_at  updated_at  scene_id
--  ----------  ----------  ---------
1   2024-02-13  2024-03-05  VT-1105
2   2024-02-14  2024-03-06  KA-338
3   2024-02-15  2024-03-07  JU-182
4   2024-02-16  2024-03-08  PX-118
5   2024-02-17  2024-03-09  PO-6339085
6   2024-02-18  2024-03-10  LA-426
7   2024-03-03  2024-03-06  KA-338-A
8   2024-03-03  2024-03-06  KA-338-B
9   2024-03-03  2024-03-06  KA-338-C
10  2024-03-04  2024-03-07  JU-182-A
11  2024-03-04  2024-03-07  JU-182-B
12  2024-03-04  2024-03-07  JU-182-C
13  2024-03-04  2024-03-07  JU-182-D
14  2024-03-05  2024-03-07  PX-118-A
15  2024-03-05  2024-03-07  PX-118-B

在尝试使用新名称创建新列时,我中途失败了:

SELECT *,
   NULLIF( ROW_NUMBER() OVER (PARTITION BY s.scene_id)-1 , 0 ) AS file_no,
   s.scene_id || '-' || CHAR(64 + ROW_NUMBER() OVER (PARTITION BY s.scene_id )-1) AS new_scene_id
FROM scenes s
ORDER BY s.id ASC
id  created_at  updated_at  scene_id   file_no  new_scene_id
--  ----------  ----------  --------   -------  ------------
1   2024-02-13  2024-03-05  VT-1105     null    VT-1105-@
2   2024-02-14  2024-03-06  KA-338      null    KA-338-@
3   2024-02-15  2024-03-07  JU-182      null    JU-182-@
4   2024-02-16  2024-03-08  PX-118      null    PX-118-@
5   2024-02-17  2024-03-09  PO-6339085  null    PO-6339085-@
6   2024-02-18  2024-03-10  LA-426      null    LA-426-@
7   2024-03-03  2024-03-06  KA-338      1       KA-338-A
8   2024-03-03  2024-03-06  KA-338      2       KA-338-B
9   2024-03-03  2024-03-06  KA-338      3       KA-338-C
10  2024-03-04  2024-03-07  JU-182      1       JU-182-A
11  2024-03-04  2024-03-07  JU-182      2       JU-182-B
12  2024-03-04  2024-03-07  JU-182      3       JU-182-C
13  2024-03-04  2024-03-07  JU-182      4       JU-182-D
14  2024-03-05  2024-03-07  PX-118      1       PX-118-A
15  2024-03-05  2024-03-07  PX-118      2       PX-118-B

我不知道如何保持前 6 行的名称不变。我尝试在 dbfiddle.uk 上组合 CHAR() 和 NULLIF(),但如果我尝试运行 CHAR(null),它根本不会运行。

sql sqlite append
1个回答
0
投票

使用 CASE 语句来决定何时添加后缀

SELECT *,
       ROW_NUMBER() OVER (PARTITION BY s.scene_id)-1  AS file_no,
       CASE ROW_NUMBER() OVER (PARTITION BY s.scene_id ) 
         WHEN 1 THEN s.scene_id 
         ELSE s.scene_id || '-' || CHAR(64 + ROW_NUMBER() OVER (PARTITION BY s.scene_id )-1) 
       END as new_scene_id
FROM [scenes] s
ORDER BY s.id ;

小提琴

id 创建于 更新于 场景_id 文件号 新场景_id
1 2024-02-13 2024-03-05 VT-1105 0 VT-1105
2 2024-02-14 2024-03-06 KA-338 0 KA-338
3 2024-02-15 2024-03-07 JU-182 0 JU-182
4 2024-02-16 2024-03-08 PX-118 0 PX-118
5 2024-02-17 2024-03-09 PO-6339085 0 PO-6339085
6 2024-02-18 2024-03-10 LA-426 0 LA-426
7 2024-03-03 2024-03-06 KA-338 1 KA-338-A
8 2024-03-03 2024-03-06 KA-338 2 KA-338-B
9 2024-03-03 2024-03-06 KA-338 3 KA-338-C
10 2024-03-04 2024-03-07 JU-182 1 JU-182-A
11 2024-03-04 2024-03-07 JU-182 2 JU-182-B
12 2024-03-04 2024-03-07 JU-182 3 JU-182-C
13 2024-03-04 2024-03-07 JU-182 4 JU-182-D
14 2024-03-05 2024-03-07 PX-118 1 PX-118-A
15 2024-03-05 2024-03-07 PX-118 2 PX-118-B
© www.soinside.com 2019 - 2024. All rights reserved.