如果SQL没有返回任何行,则执行此操作。

5

我有一个select语句,如果这个select语句没有返回任何行,则我想在每个单元格中放置''。我该怎么做?


在什么单元格内添加''?一个SSRS报表?一个Excel电子表格? - Joe Stefanelli
我有两个单元。其中一个有数据,另一个没有。我想显示这个有数据的单元的数据,但对于所有其他没有数据的单元的数据,只显示空白。如果有意义的话? - user380432
是的,这将用于 SSRS 报告。 - user380432
如果我们能看到你的代码和一些示例数据,那么可能会更有意义。 - Joe Stefanelli
基本上在表IUA中,单位e2499没有数据,但是单位E2546有数据,我需要返回这两个单位,即使单位r2499没有数据。 - user380432
显示剩余2条评论
7个回答

8
select a, b, c from t
if @@rowcount = 0
    select '' as a, '' as b, '' as c

但请确保您理解''可能与列abc的数据类型不同。


5

试试这个 -

IF NOT EXISTS ( SELECT 'x' FROM <TABLE> .... )
BEGIN
    -- Your logic goes here
END

问题在于我可能有一个显示数据的单元和一个不显示数据的单元,因此这只会显示一个单元的数据,但我希望两个单元都显示... - user380432
@anicolais - 对于您想要显示空数据的第二个单元,可以参考tenfour的答案。这样有帮助吗? - Sachin Shanbhag
在OP中有初始查询。 - user380432

4
将您的空行选择放在联合查询的底部。
select x.JobName , x.Description
from MasterJobList x
where x.IsCycleJob = 1 

union all

select "" , "" 
from MasterJobList x
where not exists
    (
    select 1
    from MasterJobList x
    where x.IsCycleJob = 1 
    )

我非常喜欢这个,对我来说非常有效,而且不需要包装在一个函数中。太好了。 - blissweb

2

听起来你仍然没有得到所有想要的行。是这样吗?我认为@Joe Sefanelli提供了解决方案的重要部分,然后提到你需要将INNER更改为LEFT连接。

所以,你说你想显示单位列表中的所有单位。如果一个单位没有数据,则显示单位和不存在的数据的空白。

以下是可能的解决方案。将你的FROM子句更改为以下内容:

FROM  [dbo].[Unit] u 
LEFT OUTER JOIN 
    (
    SELECT *
    FROM [dbo].[IUA] i
    JOIN [dbo].[Reports] r ON r.[Report_ID] = i.[Report_ID]
    JOIN [dbo].[State] s ON i.[St_ID] = s.[St_Id]
    WHERE r.[Account] = [dbo].[fn_Get_PortalUser_AccountNumber](11-11)
        AND r.[Rpt_Period] = '2126'
        AND r.[RptName] = 'tfd'
        AND r.[Type] = 'h'    
    ) ir ON ir.[Unit_ID] = u.[Unit_ID]
LEFT JOIN [dbo].[UnitType] ut ON u.[UnitType] = ut.[UnitType]
WHERE u.[Unit] IN (SELECT [VALUE] 
               FROM dbo.udf_GenerateVarcharTableFromStringList(@Units, ','))
;

通过这个更改,您将获得一个在 @Units 列表中的单位列表。左外连接将包括与每个单位相关联的数据,但不会排除没有关联数据的单位。

这实际上返回了所有报告期,这不起作用,因为我只想得到2126。该单位在不同的报告期有数据,但不在此报告期。如果我将其移入where子句中,它仍然没有返回任何行。 - user380432
Msg 206,等级 16,状态 2,行 36 操作数类型冲突:int 与 uniqueidentifier 不兼容。 Msg 8156,等级 16,状态 1,行 36 “ir”中“Report_ID”列被多次指定。 - user380432
对于 Msg 206,您需要将 SELECT * 更改为在查询中其他地方引用的列的列表。这将避免所指示的重复。对于 Msg 4104,请更改 SELECT 子句以使用 ir 而不是 i 或 s。这将引用派生表别名。 - bobs
i.[unit_id], 添加到派生表 LEFT OUTER JOIN ( SELECT i.[unit_id], i.[Non_Toll], 中。 - bobs
我没有想到这种方法,但你确实帮助我找到了答案,谢谢! - user380432
显示剩余3条评论

1

根据发布的代码,我认为您想要从UnitType表中清除列,因为这是您唯一需要左连接的表。在这种情况下,请使用

ISNULL(ut.[Description], '')  AS UnitType

如果我输入 u.number = 'e2499',它仍然不会返回任何行,它只是不会显示任何数据。我需要它能够显示单位编号但没有数据。 - user380432
然后,根据您未找到匹配行的表,您当前的一些INNER JOIN需要改为LEFT JOIN。然后像我的答案一样使用ISNULL来将这些列设置为空白。 - Joe Stefanelli
没有匹配行的表是IUA,所以我不确定在这里应该做什么,因为大多数在执行ISNULL时都会出现转换错误。 - user380432
ISNULL将返回与您正在测试的表达式相同数据类型的列。在这些情况下,可能需要进行一些转换才能返回''。 - Joe Stefanelli

0
select top 1 isnull(max(col2),' ') as noNullCol from table1 where col1='x'

如果没有行,则 max 函数会返回一个 null,而 isnull 函数则会返回 ' ' 而不是 null 值。


0
这是一个我用于单列的示例 - 它很容易,如果数据集中没有匹配项,则只会生成一个空行。
select Company from customer where customer=@Company
union
select '' where not exists (select 1 from customer where customer=@Company)

当没有匹配项时,这将创建一行空白。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接