0

TL;DR 是否有与 NULL 等效的东西,或者可以用来将其视为 NULL 的标志?可以设置空字符串,但似乎不正确(并且 Column 可以是整数类型)。

我有一个Table1像:

Table1 (Id (PK, NOT NULL), Col1 (NOT NULL), Col2 (NOT NULL), Col3)

在此只能Col3包含 NULL 值,其他都是必填列。现在我想更新这个表中的一个条目,但它需要得到某人的批准,所以我有另一个表Table1Change,如下所示:

Table1Change (Id (PK, NOT NULL), Table1Id (FK, NOT NULL), Col1, Col2, Col3)

Col1、Col2、Col3 可以为 NULL。如果它们具有非空值,则意味着它将替换Table1. 所以 ApproveUpdate 存储过程看起来像:

UPDATE Table1
SET Col1 = ISNULL(Table1Change.Col1, Table1.Col1),
    Col2 = ISNULL(Table1Change.Col2, Table1.Col2),
    Col3 = ISNULL(Table1Change.Col3, Table1.Col3)
FROM Table1
INNER JOIN Table1Change ON Table1.Id = Table1Change.Table1Id
WHERE Table1.Id = @table1Id  
  AND Table1Change.Id = @table1ChangeId;

上述方法的一个问题是,假设我有一些值,Col3现在Table1我想删除它(我应该尽可能为Col3NULL),Table1Change只是简单地将值设置为 NULL 是行不通的。ISNULL将采用原始列的值。

所以现在我的问题是,是否有类似的东西NULL,或者我可以使用一些标志来设置Col3in的值Table1Change,所以如果设置了存储过程,那么存储过程将Col3变为Table1NULL。可以设置空字符串但看起来不太好(并且 Col3 可以是整数类型)。

我知道的另一种选择是改变Table1Change表格的处理方式。新架构将如下所示:

Table1Change(Id (PK, NOT NULL), Table1Id(FK, NOT NULL), Col1(NOT NULL), Col2(NOT NULL), Col3)

现在,如果对 的行有任何更新Table1,所有数据都将被复制到Table1Change更新的字段。类似的东西(Col1, Col2, Col3)(oldValue, oldValue, newValue)。现在问题解决了,因为 ApproveUpdate 只会将整个记录复制到原始表中,因此如果 newValue 为 NULL,它将替换现有值。但这对我来说需要很多改变,所以我把它作为最后的选择。如果没有简单的方法来改变我当前的设置,我也愿意为这种类型的用例提供其他更好的设计。

4

1 回答 1

2

Null 在这里不能用来表示两件事:

  • 不更新值
  • 将值设置为空。

没有两种类型的 Null 可以让您区分这两种情况。

您将不得不对此进行设计,您可以使用一些“魔术”值来表示空白字段,尽管我并不完全热衷于该选项。(它确实允许您在不更改表的情况下实现它,只需更改 proc 逻辑。)

您可以同样将更多列添加到 Table1Change,例如 BlankCol1、BlankCol2、BlankCol3,作为布尔(位)列,并使用它来表示值是否应为空白。

于 2018-05-11T10:05:55.867 回答