【问题标题】:SQL Update with Subquery Null Conditional带有子查询空条件的 SQL 更新
【发布时间】:2017-04-18 18:31:17
【问题描述】:

我正在尝试运行类似于以下内容的查询。我基本上是在尝试有条件地更改更新文本的格式。我需要一些帮助,因为我尝试了几种不同的方法但没有成功。提前致谢。

UPDATE bL SET 
bL.[QUANTITY] = bL.[QUANTITY] + 2,
bL.[SERIAL_NUMBERS] = 
    (
      CASE WHEN bL.[SERIAL_NUMBERS] IS NOT NULL 
      THEN ISNULL(bL.[SERIAL_NUMBERS], '') + 'EOSB7U310007; EOSB7U310022' 
      ELSE bL.[SERIAL_NUMBERS] + '; EOSB7U310007; EOSB7U310022'
    ) 
 FROM [ROBOTICS_OPTICS_MECHUAT].[dbo].[AOF_BOXES_LINES] AS bL 
 LEFT JOIN [ROBOTICS_OPTICS_MECHUAT].[dbo].[AOF_BOXES] AS bO 
 ON bL.[AOF_BOXES_ID] = bO.[ID] 
 WHERE bO.[SELECTED] = 'True'

【问题讨论】:

  • 删除case when之前的select。
  • 另外,将null 连接到字符串将产生null。
  • @ZoharPeled 抱歉,鉴于单元格值为空,我忘了添加 I ISNULL()。
  • @WEI_DBA 哇,我怎么会错过...这表明你,当你厌倦了看某物时,第二双眼睛总是有益的:D
  • Zohar 的缩短版可能最适合您。试一试。

标签: sql sql-server sql-server-2008 sql-server-2012 sql-server-2008-r2


【解决方案1】:

因此,将我发现正确的所有 cmets 放在一个答案中,您的代码应该如下所示:

UPDATE bL SET 
bL.[QUANTITY] = bL.[QUANTITY] + 2,
bL.[SERIAL_NUMBERS] = 
    (
      CASE WHEN bL.[SERIAL_NUMBERS] IS NULL 
      THEN 'EOSB7U310007; EOSB7U310022' 
      ELSE bL.[SERIAL_NUMBERS] + '; EOSB7U310007; EOSB7U310022'
      END
    ) 
 FROM [ROBOTICS_OPTICS_MECHUAT].[dbo].[AOF_BOXES_LINES] AS bL 
 LEFT JOIN [ROBOTICS_OPTICS_MECHUAT].[dbo].[AOF_BOXES] AS bO 
 ON bL.[AOF_BOXES_ID] = bO.[ID] 
 AND bO.[SELECTED] = 'True'

但它可以缩短 - 像这样:

UPDATE bL SET 
bL.[QUANTITY] = bL.[QUANTITY] + 2,
bL.[SERIAL_NUMBERS] = ISNULL(bL.[SERIAL_NUMBERS] + '; ', '') + 'EOSB7U310007; EOSB7U310022'
 FROM [ROBOTICS_OPTICS_MECHUAT].[dbo].[AOF_BOXES_LINES] AS bL 
 LEFT JOIN [ROBOTICS_OPTICS_MECHUAT].[dbo].[AOF_BOXES] AS bO 
 ON bL.[AOF_BOXES_ID] = bO.[ID] 
 AND bO.[SELECTED] = 'True'

这是因为bL.[SERIAL_NUMBERS] 的值为空,那么它与; 的连接也将为空。

注意事项:

  • 我已将 bO.[SELECTED] = 'True' 从 WHERE 子句移至 ON 子句。这是因为在使用左连接时,右表的所有条件都应该在ON子句上,否则会变成内连接。

  • 似乎您正在使用bL.[SERIAL_NUMBERS] 列来存储多个值。在 99.9999% 的情况下,这是一个大错误。
    阅读Is storing a delimited list in a database column really that bad?,你会看到很多原因。

【讨论】:

  • 注明。客户以这种方式设计了他们的系统,我只是在适应和整合他们:)
【解决方案2】:

你不需要SELECT,你必须END你的CASE声明。

UPDATE  bL
SET     bL.[QUANTITY] = bL.[QUANTITY] + 2
      , bL.[SERIAL_NUMBERS] = ( CASE WHEN bL.[SERIAL_NUMBERS] IS NOT NULL 
                                     THEN ISNULL(bL.[SERIAL_NUMBERS] , '') + 'EOSB7U310007; EOSB7U310022'
                                     ELSE bL.[SERIAL_NUMBERS] + '; EOSB7U310007; EOSB7U310022'
                                END )
FROM    [ROBOTICS_OPTICS_MECHUAT].[dbo].[AOF_BOXES_LINES] AS bL
LEFT JOIN [ROBOTICS_OPTICS_MECHUAT].[dbo].[AOF_BOXES] AS bO ON bL.[AOF_BOXES_ID] = bO.[ID]
WHERE   bO.[SELECTED] = 'True';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2021-12-27
    • 2012-12-04
    • 1970-01-01
    相关资源
    最近更新 更多