插入与递增数字序列连接的文本

Posted

技术标签:

【中文标题】插入与递增数字序列连接的文本【英文标题】:Insert text concatenated with incrementing number sequence 【发布时间】:2019-09-27 11:16:43 【问题描述】:

我想在一个表中插入 1000 行。我想生成和插入的数据是TEXT0001TEXT1000。所以单个数字需要有 3 个前导零(例如 1 -> 0001),2 个数字需要有 2 个前导零(2 -> 0091)等等。

我查看了this 关于如何在不使用循环的情况下生成一系列数字的答案,但我需要在数字前面添加文本。

我试过了:

INSERT INTO projects
  SELECT TOP (1000) CONCAT("TEXT",  n) = ROW_NUMBER()OVER (ORDER BY [object_id]) 
  FROM sys.all_objects ORDER BY n;

但这会产生错误 - incorrect syntax near =

我已经读到使用基于SET 的方法是最好的方法,我应该避免循环,但没有实际的例子可以为我指明正确的方向。

请问我该怎么做?

【问题讨论】:

这不是有效的 SQL 语法。函数参数通过括号中传递,而不是通过赋值运算符。我不知道有什么语言可以这样工作 【参考方案1】:

我认为你需要下面

INSERT INTO projects
  SELECT TOP (1000) "TEXT" + right('0000',cast ((ROW_NUMBER()OVER (ORDER BY [object_id])) as varchar),4)
  FROM sys.all_objects ;

【讨论】:

谢谢@Zaynul。我将如何将生成的数字格式化为 4 位数字。例如,我需要 0001 而不是 1。【参考方案2】:

我建议保留concat() 并修正语法:

INSERT INTO projects (<column name here>)
  SELECT TOP (1000) CONCAT('TEXT', 
                           FORMAT(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), '0000')) as n
  FROM sys.all_objects
  ORDER BY n;

【讨论】:

谢谢戈登。这种格式的单个数字,例如 1 为 0001 吗? 按n排序表示TEXT1、TEXT10、TEXT11等【参考方案3】:

经过一些语法更正和FORMAT 功能,你有:

INSERT INTO #temp
SELECT TOP 1000 'TEXT' + FORMAT(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), '0000') AS n
FROM sys.all_objects
ORDER BY n -- it is a zero-padded varchar suitable for order-by

【讨论】:

以上是关于插入与递增数字序列连接的文本的主要内容,如果未能解决你的问题,请参考以下文章

Bridging signals POJ 1631(最长递增子序列dp)

PTA 递增的整数序列链表的插入

牛牛的数列 最长递增子序列

华为OD机试 -非严格递增连续数字序列(Java) | 机试题+算法思路+考点+代码解析 2023

2022华为机试真题 C++ 实现非严格递增连续数字序列

华为OD机试真题 Python 实现非严格递增连续数字序列