首页 > 解决方案 > 如何有条件地向字段添加递增数字?

问题描述

使用 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 并不重要。

标签: sqlsql-server

解决方案


应该会给你你想要的结果:

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长度值较低,则需要将其转换为上述表达式中的适当大小。


推荐阅读