当前N小于N时给出空值

问题描述 投票:0回答:2

所以这就是交易,我有一堆原始数据需要通过C#以编程方式处理和输出,为此我使用SQL为变量赋值,因为它迭代“发票号”。

发票必须包含限制为70个字符的说明。我也只有5个描述字段,我可以填写。

一些发票超过5个,其他发票只有1个。

所以我有这个:

SELECT DISTINCT top 5

iw.Descript,
NEWID()
FROM staging.InputOrigin iw 


left join [Parameters].[VendorMasterUpdate] VMU ON VMU.article = iw.article AND iw.Country=vmu.origin 

WHERE post_advice='XXXXXXX' 
ORDER BY NEWID() 

我正在使用它来获得“前5名”随机描述。

C#分配变量如下:

var Desc1 = table2.Rows[i]["Descript"];

现在我知道我可以参数化i来检查rowscount,如果rowscount小于5,那么迭代until i = rowscountrowscount以上的所有内容都有NULL的描述。

但我正在寻找相反的方向,这是如何在SQL上做到这一点。

任何方式我可以随机获得TOP 5,如果这个小于5,那么用NULLS填充额外的值?

c# sql sql-server
2个回答
3
投票

我会使用一个计数表(在这种情况下只有5个值),然后是一个LEFT JOIN

SELECT V.I,
       sq.Descript
FROM (VALUES (1),(2),(3),(4),(5)) V (i)
     LEFT JOIN (SELECT TOP 5 
                       iw.Descript,
                       ROW_NUMBER() OVER (ORDER BY NEWID()) AS RN
                FROM staging.InputOrigin iw
                     LEFT JOIN [parameters].[VendorMasterUpdate] VMU ON VMU.article = iw.article
                                                                    AND iw.Country = VMU.origin
                WHERE post_advice = 'XXXXXXX'
                GROUP BY iw.Descript) sq ON sq.RN = V.i;

2
投票

一种快速而肮脏的方式是:

With CTE as
(... my query...)
, CTE2 as
(
select *
from CTE
union all
select null, null, null -- 1
union all
select null, null, null -- 2
union all
select null, null, null -- 3
union all
select null, null, null -- 4
union all
select null, null, null -- 5
)
select top 5 * 
from CTE2
order by thenewidcolumn
© www.soinside.com 2019 - 2024. All rights reserved.