sql - 如何有条件地向字段添加递增数字?
问题描述
使用 SQL Server 2017;我有一张这样的桌子:
FlexID (int) | ColorCode (varchar) | MPID (varchar) | ...other fields
---------------------------------------------------------------------
12 | RD14 | 1234
<NULL> | G21D | <NULL>
<NULL> | <NULL> | <NULL>
14 | RD14 | 1235
12 | <NULL> | <NULL>
FlexID 和 ColorCode 不是唯一的,但如果 MPID 不为空,则 MPID 是唯一的。我想从中进行选择,如果 FlexID 和 ColorCode 都不为空,则取 MPID,否则取一个值'UNDEFINED' + n
,其中 n 是针对每个 UNDEFINED 情况递增的某个数字。我知道我需要这样的东西:
SELECT
CASE
WHEN FLEXID is NULL
OR ColorCode is NULL THEN 'UNDEFINED' --tack on an incrementing number starting at 1
ELSE [MPID]
END AS ID
FROM myTable
但我不知道如何获得我想要的行为。输出应如下所示:
ID
--
1234
UNDEFINED1
UNDEFINED2
1235
UNDEFINED3
这里的想法是添加n
第 th 个数字以产生唯一值。我确实需要从头开始,n=1
所以使用ROWNUM
对我不起作用。我知道我必须对此有一些 ORDER BY 部分 - 使用哪一列来 ORDER BY 并不重要。
解决方案
这应该会给你你想要的结果:
ISNULL(MPID, 'UNDEFINED' + CONVERT(varchar(5),ROW_NUMBER() OVER (PARTITION BY MPID ORDER BY (SELECT NULL))))
请注意,未定义行的数字实际上是随机的;因为它将按照 SQL Server 处理行的任何顺序(每次可能相同,也可能不同)。
注意:您尚未为您的 column 定义数据类型的长度MPID
。这低于 avarchar(10)
您将遇到截断问题(如果是 a varchar(10)
,它们将从 开始'UNDEFINED10'
。如果MPID
长度值较低,则需要将其转换为上述表达式中的适当大小。
推荐阅读
- mysql - 设置具有多个日期范围的多个总和
- numpy-ndarray - np.where() 与 np.linspace()
- r - 自动创建数据子集
- python-3.x - 为什么首先测试一个类方法会导致其他应该引发错误的单元测试失败?
- firebase - 错误:找不到正确的提供者
- > 在此规划器小部件上方
- jquery - Django jquery ajax 评论回复创建多个值
- c++ - 如何从 QUdpSocket 检测“端口不可达”情况?
- python - 二维矩阵 PYTHON 中的最大和矩形
- sql-server - SAS proc sql passthrough无限期运行
- javascript - 无法使用 JQuery 将值传入或传出 Python