如何有条件地向字段添加递增数字?

时间:2018-12-04 15:56:30

标签: sql sql-server

使用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如果不为null则是唯一的。我想从中进行选择,如果FlexID和ColorCode都不为null,则采用MPID,否则采用值'UNDEFINED' + n,其中n是每个未定义大小写递增的数字。我知道我需要这样的东西:

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个数字上加上一个唯一的值。我确实需要从n=1开始,所以使用ROWNUM对我不起作用。我知道我必须对此有一些ORDER BY的要求-哪个列用于ORDER BY没关系。

1 个答案:

答案 0 :(得分:1)

应该为您提供所需的结果:

ISNULL(MPID, 'UNDEFINED' + CONVERT(varchar(5),ROW_NUMBER() OVER (PARTITION BY MPID ORDER BY (SELECT NULL))))

请注意,未定义行实际上是随机的;因为SQL Server会以任何顺序处理行(每次可能相同,也可能不同)。

注意:您尚未为列MPID定义数据类型的长度。这比varchar(10)低,您将遇到截断问题(如果是varchar(10),它们将从'UNDEFINED10'开始。如果MPID的值较低长度,您需要在上面的表达式中将其转换为适当的大小。