使用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没关系。
答案 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
的值较低长度,您需要在上面的表达式中将其转换为适当的大小。