簡體   English   中英

等效於SQL Server中的NULL

[英]Equivalent to NULL in SQL Server

TL; DR是否有等同於NULL的東西,或可以用來將其視為NULL的某些標志? 可以設置空字符串,但看起來不正確(列可以是整數類型)。

我有一個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。 如果它們具有非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;

上面方法的一個問題是,假設我在Table1 Col3中有一些值,現在我想刪除它(我應該是因為Col3可以為NULL),在Table1Change ,僅僅將值設置為NULL是行不通的。 由於ISNULL將采用原始列的值。

所以,現在我的問題,是有什么等價的NULL ,或一些標志,我可以用它來設置值Col3Table1Change ,所以如果設置存儲過程將Col3Table1 NULL。 可以設置空字符串,但看起來不太好(並且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,它將替換現有值。 但這需要我做很多改變,因此我將其保留為最后選擇。 而且,如果沒有簡單的方法來更改當前的設置,那么對於這種用例,我也願意接受其他更好的設計。

空不能在這里表示兩件事:

  • 不更新值
  • 將值設置為null。

沒有兩種類型的Null可以區分兩種情況。

您將不得不對此進行設計,您可以使用一些“不可思議”的值來表示對字段進行消隱,盡管我並不完全熱衷於該選項。 (它的確使您無需更改表即可實現它,而只需更改proc邏輯即可。)

您可以將更多列(例如BlankCol1,BlankCol2,BlankCol3)同樣地添加到Table1Change中,作為布爾(位)列,並使用它們來表示是否應將值空白。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM