[英]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
,或一些標志,我可以用它來設置值Col3
在Table1Change
,所以如果設置存儲過程將Col3
在Table1
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可以區分兩種情況。
您將不得不對此進行設計,您可以使用一些“不可思議”的值來表示對字段進行消隱,盡管我並不完全熱衷於該選項。 (它的確使您無需更改表即可實現它,而只需更改proc邏輯即可。)
您可以將更多列(例如BlankCol1,BlankCol2,BlankCol3)同樣地添加到Table1Change中,作為布爾(位)列,並使用它們來表示是否應將值空白。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.