【问题标题】:Return all records and display message if record is NULL如果记录为 NULL,则返回所有记录并显示消息
【发布时间】:2018-05-10 20:53:08
【问题描述】:

我正在处理来自我们分销商的内容,他们的数据库文件并不是世界上最好的。所以,我正在尽我所能,用我所拥有的。

我有两张桌子,HLItemsHLImages

我需要从HLItems 退回所有产品。对于不存在的行,我需要显示一条消息。

  • 如果存在 = '封面'
  • 如果不存在 = '无封面'

这是我尝试过的,但它不起作用。它返回所有记录,即使是 NULL 行,也会显示“封面”。

封面是记录存在时显示在记录中的内容。否则,什么都没有。

使用右外连接

SELECT    
    (CASE 
        WHEN EXISTS (SELECT TOP 1 HLImages.Caption 
                     FROM HLImages  
                     RIGHT OUTER JOIN HLItems ON HLImages.ItemNo = HLItems.ItemNo) 
           THEN 'Front Cover'
           ELSE 'No Cover' 
     END) AS thumbnail, 
    Title, ItemNo, InternetCategoryID
FROM  
    HLItems
WHERE 
    (InternetCategoryID = 11)

只选择列

SELECT  
    (CASE 
        WHEN EXISTS (SELECT TOP 1 Caption
                     FROM HLImages
                     WHERE Caption = 'Front Cover') 
           THEN 'Front Cover'
           ELSE 'No Cover' 
     END) AS thumbnail, 
    Title, ItemNo, InternetCategoryID
FROM
    HLItems
WHERE (InternetCategoryID = 11)

这样的事情,是预期的。 (ItemNo 和 Caption.. 为简单起见如下所示)

297110 - 封面
297110 - 空
49043128 - 封面
49014741 - 空
50563362 - 封面
50301310 - 空

【问题讨论】:

  • 能否请您显示数据和所需的结果。只是想得到问题的正确翻译
  • maSTAShuFu,更新信息

标签: sql sql-server sql-server-2008


【解决方案1】:

在中使用RIGHT OUTER JOIN

SELECT TOP 1 HLImages.Caption 
FROM HLImages  
RIGHT OUTER JOIN HLItems ON HLImages.ItemNo = HLItems.ItemNo

的效果是,来自HLItems(右表)的所有行都包含在结果中,无论是否存在来自HLImages 的匹配行。这意味着,EXISTS 中的此查询始终为真。这就是为什么你总是从那个CASE 得到'Front Cover'

(如果HLItems 中没有行,则EXISTS 只能为假。但如果没有,外部查询将不会有非空结果,因此您不会看到'No Cover'在那种情况下也是如此。)

还有那个

SELECT TOP 1 Caption
FROM HLImages
WHERE Caption = 'Front Cover'

如果有任何带有标题'Front Cover' 的图像,无论它属于哪个产品,都将始终生成一个非空集。我假设有这样的图像,所以和上面一样。

尝试使用WHERE 的简单相关子查询。

SELECT    
    (CASE 
        WHEN EXISTS (SELECT *
                     FROM HLImages  
                     WHERE HLImages.ItemNo = HLItems.ItemNo
                           AND HLImages.Caption = 'Front Cover')
           THEN 'Front Cover'
           ELSE 'No Cover' 
     END) AS thumbnail, 
    Title, ItemNo, InternetCategoryID
FROM  
    HLItems
WHERE 
    (InternetCategoryID = 11)

如果您只想查看产品的任何图片是否存在,则可以删除AND HLImages.Caption = 'Front Cover',而不管标题如何。

【讨论】:

  • 我必须将 AND HLImages.Caption = 'Front Cover'.... 留在里面,好像没有,那么它将返回更多记录,即预期的结果。
  • @CodingEE:我只是不确定我在这点上是否正确。这就是我提到它的原因。
【解决方案2】:

在不知道预期结果的情况下,一个不起眼(可能不完美)的解决方案是使用外部应用

SELECT   
case when image.Caption is not null then 'Front Cover'
    else 'No Cover'
end
as thumbnail, 
Title, 
ItemNo, 
InternetCategoryID
FROM  HLItems item
outer apply(
    SELECT   top 1 HLImages.Caption AS Caption
    FROM  HLImages 
    where HLImages.ItemNo = item.ItemNo
) image
WHERE (item.InternetCategoryID = 11)

【讨论】:

  • 你好,列维。请在我的主要帖子中查看示例。此外,您的代码也有几个错误。无法运行它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
  • 2019-08-05
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
相关资源
最近更新 更多