SQL - 列出记录之间的所有页面,同时维护 ID 键

标签 sql sql-server t-sql

我正在尝试提出一种有用的方法,将文档第一页和最后一页之间的所有页面列出到新行中,同时将 ID 号保留为键或交叉引用。我有几种方法可以获取中间的页面,但我不太确定如何以编程方式维护 key 。

输入示例:

First Page  Last Page  ID
ABC_001     ABC_004    1
ABC_005     ABC_005    2
ABC_006     ABC_010    3

最终结果:

All Pages  ID
ABC_001    1
ABC_002    1
ABC_003    1
ABC_004    1
ABC_005    2
ABC_006    3
ABC_007    3
ABC_008    3
ABC_009    3
ABC_010    3

非常感谢任何帮助。我正在使用 SQL mgmt studio。

最佳答案

一种方法是设置一个数字表,其中包含您可能在列内容中找到的数字列表:

CREATE TABLE numbers( idx INTEGER);
INSERT INTO numbers VALUES(1);
INSERT INTO numbers VALUES(2);
...
INSERT INTO numbers VALUES(10);

现在,假设所有页面值都有 7 个字符,最后 3 位是数字,我们可以将原始表与 numbersJOIN来生成缺失的记录:

SELECT 
    CONCAT(
        SUBSTRING(t.First_Page, 1, 4), 
        REPLICATE('0', 3 - LEN(n.idx)),
        n.idx
    ) AS [ALl Pages],
    t.id
FROM
    mytable t
    INNER JOIN numbers n 
        ON  n.idx >= CAST(SUBSTRING(t.First_Page, 5, 3) AS int)
        AND n.idx <= CAST(SUBSTRING(t.Last_Page, 5, 3) AS int)

这个 demo on DB Fiddle 与您的示例数据返回:

ALl Pages | id
:-------- | -:
ABC_001   |  1
ABC_002   |  1
ABC_003   |  1
ABC_004   |  1
ABC_005   |  2
ABC_006   |  3
ABC_007   |  3
ABC_008   |  3
ABC_009   |  3
ABC_010   |  3

关于SQL - 列出记录之间的所有页面,同时维护 ID 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55153016/

相关文章:

sql - 基于ERD图的SQL的两道题。 (新手级别)

php - 如何将列值添加到 SQL LIKE 查询?

sql - 获取与传入员工属于完全相同位置列表的所有员工

mysql - SELECT * JOIN ON 主键 = 外键操作中的重复列?

mysql - 是否可以在 mysql 中插入单词和变量的组合?

sql-server - SQL Server CLR 存储过程在数据处理任务中——是好还是坏?

c# - 使用 C# 的 SQL Server 加密/解密

sql-server - SQL Server GROUP BY datetime 忽略小时分钟以及带有日期和总和值的选择

sql - 根据两对组合的权重找到最接近的数字

sql - 如何在 SQL Server 中 nvarchar(max) 类型列中现有的 json 结构中添加新属性