翻譯|使用教程|編輯:吉煒煒|2024-12-20 10:32:55.383|閱讀 109 次
概述:本文探討 SQL Server 中 NULL 和空值之間的區別,并討論如何有效地處理它們。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
在使用數據庫時,我們經常會遇到缺少數據的行。這些缺失數據可能是由于未知或不適用的值、數據導入或輸入過程中的錯誤或涉及不存在值的特定計算造成的。在這種情況下,有兩種表示缺失數據的方法:NULL 和空值(或空白值)。
雖然乍一看它們似乎相同,但它們是不同的,并且以不同的方式影響基本數據庫操作。本文探討 SQL Server 中 NULL 和空值之間的區別,并討論如何有效地處理它們。
dbForge Studio for SQL Server官方正版下載
SQL Server 中的 NULL 和空值
NULL 表示數據庫列中缺失或未知的數據。這可能發生在兩種情況下:數據不存在或數據存在但當前未知。NULL 可以分配給任何數據類型的字段,包括字符串、整數和日期。重要的是,該字段沒有分配內存,因為 NULL 表示未知值。
相反,數據庫中的空白或空白區域是指空字符或空白字符。雖然其含義可能看起來與 NULL 相似,但它的存儲和檢索方式與文本字段中的任何其他字符一樣。空字符串特定于字符串列,不能應用于不同的數據類型。
例如,考慮一個包含產品信息的表,其中有一列存儲保修詳細信息。此列中的 NULL 值表示未指定保修期。相反,空值表示產品沒有保修。
在數據庫中,NULL 值和空白字符串在定義、語法和長度上有所不同,并且在查詢和數據操作中對它們的處理也不同。因此,分別檢測 NULL 和空值通常是必不可少的。大多數數據庫管理系統(包括 SQL Server)都提供了有效處理這種區別的工具和功能。
查找 NULL 或空值的標準方法
根據具體情況,如果 NULL 和空值代表相似的概念,則可將它們一起處理;如果它們在數據模型中具有不同的含義或條件,則可將它們分開處理。這種區別會顯著影響查詢性能和結果的準確性。
最常見的情況是,需要通過刪除 NULL 和空值或將 NULL 替換為其他值(如空)來避免 NULL 值錯誤。為了有效地管理這種情況,用戶需要可靠的方法來識別 NULL 和空列值。本指南探討了 SQL Server 中可用的內置工具,包括專用查詢和函數。
使用 IS NULL 運算符
SQL Server 中的 IS NULL 運算符檢查列或表達式是否包含 NULL 值。基本查詢語法如下:
SELECT column_names FROM table_name WHERE column_name IS NULL;
讓我們看一個簡單的例子。在此示例和后續示例中,我們將使用流行的 SQL Server AdventureWorks2022 測試數據庫和SQL Server dbForge Studio來演示測試用例。
假設我們需要檢索產品列表,包括其名稱和重量,其中重量小于 10 磅或顏色未知(即 NULL)。以下是實現此目的的查詢:
SELECT pt.ProductID ,Name ,Weight ,Color FROM [Product.Test] pt WHERE Color IS NULL
搜索空字符串
正如我們前面提到的,空值是長度為零的字符串,這會導致問題,因為空字符串不等于 NULL 值。SQL Server 對它們進行不同的處理,在具有 WHERE 條件的查詢中使用 IS NULL 運算符不會返回空字符串。搜索空值的條件語法是:
WHERE column_name = ''
因此,基本查詢語法是:
SELECT column_names FROM table_name WHERE column_name = ''
假設我們要檢索Style列包含空值的產品列表。 在這種情況下,我們需要搜索空值:
SELECT pt.Name ,pt.ProductNumber ,pt.Style FROM [Product.Test] pt WHERE pt.Style = ''
用戶經常需要同時獲取 NULL 和空值。然后,我們可以使用 OR 運算符將 IS NULL 運算符與空值搜索結合起來,如下所示:
SELECT column_names FROM table_name WHERE column_name = '' OR column_name IS NULL
我們要檢查表中是否所有產品都分配了ListPrice值。為此,我們要檢查是否有產品的ListPrice為 NULL 且ListPrice為空:
SELECT ProductID ,Name ,ProductNumber ,ListPrice FROM dbo.[Product.Test] WHERE ListPrice = '' OR ListPrice IS NULL
輸出包含空字符串和 NULL 值,從而給出更廣泛的結果。
使用 TRIM 函數來獲取僅包含空格的值
某些列可能包含完全由空格組成的值,這在從各種來源導入數據時很常見。這些值通常被視為空,因為它們缺乏有意義的字符。要識別此類行,您可以使用 TRIM 函數。
默認情況下,TRIM 會刪除前導和尾隨空格,但也可以刪除字符串開頭和結尾的其他指定字符。在這種情況下,我們使用這個函數在以標準方式檢查空值之前刪除空格。
基本查詢語法是:
SELECT column_name FROM table_name WHERE column_name IS NULL OR TRIM(column_name) = ''
以下查詢選擇列Color、Size、ProductLine、Class和Style為 NULL 或在修剪任何前導和尾隨空格后實際上為空的行。
SELECT Color ,Size ,ProductLine ,Class ,Style FROM dbo.[Product.Test] WHERE (Color IS NULL OR TRIM(Color) = '') OR (Size IS NULL OR TRIM(Size) = '') OR (ProductLine IS NULL OR TRIM(ProductLine) = '') OR (Class IS NULL OR TRIM(Class) = '') OR (Style IS NULL OR TRIM(Style) = '')
它可以幫助我們確保指定列中沒有空值或無意義的值。
內置 SQL Server 函數
除了 SQL 查詢之外,Microsoft SQL Server 還提供了專門用于處理 NULL 值的內置函數。在本節中,我們將探討它們的工作原理。
使用 COALESCE 函數
SQL COALESCE 允許我們用默認值替換 NULL,從而確保輸出中只有有意義的數據。當 NULL 值可能破壞計算或損害數據準確性時,此功能非常有用。
語法是:
COALESCE (expression [ ,...n ] )
我們使用的測試表包含一些 NULL 和一些空值,而不是有意義的數據。在我們的場景中,我們想要檢索缺少一些基本參數的產品名稱。包含顏色和尺寸 NULL 的行將返回為未知,而未提供ListPrice 的行將返回為 0。
SELECT Name ,Color ,Size ,ListPrice ,COALESCE(Color, 'No Color') AS MissingColor ,COALESCE(Size, 'No Size') AS MissingSize ,COALESCE(ListPrice, 0) AS MissingListPrice FROM dbo.[Product.Test]
結果,我們得到一個定義所有具有 NULL 值的案例的表,并可以進一步處理數據。
SQL Server 中的 COALESCE 函數可以與 TRIM 函數一起使用,通過一個查詢檢索同時具有 NULL 和空值的行。
語法是:
SELECT column_name FROM table_name WHERE TRIM(COALESCE(code, '')) = ''
這里,代碼是需要過濾數據的列的名稱。
在我們的測試用例中,我們想要識別Color列中具有 NULL 或空值的產品:
SELECT ProductID ,Name ,Color FROM dbo.[Product.Test] WHERE TRIM(COALESCE(Color, '')) = ''
此查詢識別具有 NULL 或空白顏色值的產品,并確保僅包含空格的字符串被視為空。
使用 NULLIF 函數
NULLIF 函數比較兩個表達式,如果它們相等,則返回 NULL。當應用于包含空值的列時,它返回 NULL,允許我們使用 IS NULL 運算符檢查 NULL:
SELECT column_name FROM table_name WHERE NULLIF(TRIM(code), '') IS NULL
看看下面的例子:
SELECT Name ,Color ,Size FROM dbo.[Product.Test] WHERE NULLIF(TRIM(COALESCE(Color, '')), '') IS NULL OR NULLIF(TRIM(COALESCE(Size, '')), '') IS NULL
此查詢使用 NULLIF 和 TRIM 函數有效地從表中過濾并返回Color或Size列為 NULL、空或僅包含空格的行。
使用 ISNULL 函數
ISNULL 函數用預定義的有意義的值替換 NULL。
該函數的語法是:
ISNULL(expression, replacement)
這里,expression是列名,而replacement是當列值為NULL時將替換該列的值。
在下面的例子中,我們檢索產品顏色、尺寸和類別的數據,并用預定義值Unknown替換 NULL :
SELECT Name ,ISNULL(NULLIF(LTRIM(RTRIM(Color)), ''), 'Unknown') AS Color ,ISNULL(NULLIF(LTRIM(RTRIM(Size)), ''), 'Unknown') AS Size ,ISNULL(NULLIF(LTRIM(RTRIM(Class)), ''), 'Unknown') AS Class FROM dbo.[Product.Test]
管理 NULL 或空值的高級技術
處理 NULL 和空值通常涉及高級技術,以實現更高效的數據處理和更精確的結果。
您可能已經注意到函數組合的使用,例如 TRIM 與 COALESCE 或 TRIM 與 ISNULL。多個函數的組合允許更高級的數據操作,從而提供精確且有針對性的結果。
以下查詢演示了如何通過刪除空格并用占位符替換 NULL 值來清理Color列中的數據,以識別缺少顏色定義的記錄:
SELECT ProductID ,Name ,ISNULL(NULLIF(TRIM(COALESCE(Color, '')), ''), 'Not provided') AS Color FROM dbo.[Product.Test]
COALESCE 函數將Color中的所有 NULL 值替換為空字符串,從而可以安全地應用 TRIM,進而從Color列中刪除所有前導或尾隨空格。NULLIF(TRIM(…),”) 將空字符串(最初為空或修剪為空)轉換回 NULL。ISNULL(…, 'Not provided') 將任何 NULL 值(無論是最初為 NULL 還是由 NULLIF 轉換為 NULL)替換為字符串Not provided。
在 SQL Server 中,您可以使用條件表達式(例如 CASE)以及 ISNULL、COALESCE 和 TRIM 等函數來處理不同類型的缺失數據。在這種情況下,ISNULL() 或 COALESCE() 會用預定義的占位符替換 NULL,TRIM 會刪除前導和尾隨空格并檢查空字符串 (”),而 CASE 與 TRIM 結合可確保將僅包含空格的字符串視為空。
下面是使用Product.Test表的示例查詢,旨在根據缺失數據的類型將Class分類:
SELECT ProductID ,Name ,Class ,CASE WHEN Class IS NULL THEN 'Missing (NULL)' WHEN TRIM(Class) = '' THEN 'Missing (Empty or Spaces)' ELSE Class END AS ProductClassStatus FROM dbo.[Product.Test]
這種先進的技術有助于確保一致地處理缺失數據,并清理數據以進行分析、報告和驗證。
具有 NULL 和空值的大型數據集的性能注意事項
處理包含 NULL 和空值的大型數據集時,性能考慮至關重要,因為不同的因素會顯著影響查詢執行和資源使用。考慮以下因素和策略來優化性能:
SQL Server 中 NULL 值的索引方式不同,查詢過濾可能無法有效利用索引。為避免出現問題,請使用過濾索引以僅包含非 NULL 或相關行(例如,WHERE Column IS NOT NULL)。
直接在 WHERE 子句或索引列中應用 ISNULL、COALESCE 和 TRIM 等函數可能會阻止索引使用并導致全表掃描。解決方案是重組查詢以從 WHERE 子句中刪除這些函數。此外,先進的現代 ETL 解決方案提供內置工具以立即清理數據。
如果管理不當,與內存分配相關的 NULL 和空值的不同處理可能會導致存儲開銷。為了避免這種情況,請在數據輸入期間評估列默認值以盡量減少 NULL 和空值。
復雜的條件表達式可能會導致大型數據集的性能下降。解決方案可能是將 NULL 和空值分成不同的查詢過程。此外,在執行查詢之前利用執行計劃分析來識別查詢瓶頸,這將有助于相應地優化它們。
在 SQL Server 中,包含許多 NULL 或空值的列的基數估計可能會受到影響。使用專用的 UPDATE STATISTICS 命令或自動更新功能定期更新統計信息至關重要。
這些策略可以幫助您確保有效處理具有 NULL 和空值的大型數據集,同時最大限度地減少資源消耗和查詢執行時間。
結論
NULL 和空值在數據庫中很常見,因此了解它們的概念、區分它們并適當處理它們至關重要。本文探討了識別和解決由 NULL 或空值定義的缺失數據情況的可靠方法。它提供了實用的技術來幫助清理數據并確保計算準確。為了說明這些情況,我們使用了 dbForge Studio for SQL Server,這是一種擅長處理此類情況的工具。
dbForge Studio for SQL Server 提供了一個功能強大的 SQL 編輯器,其中包含基于上下文的建議、代碼分析、語法驗證、格式和代碼片段,使用戶能夠以兩倍的速度編寫高質量的 SQL 代碼。此外,Studio 還提供了一套全面的工具集來管理 SQL Server 數據庫,無論是在本地還是在云中。
歡迎下載并體驗它如何將您的工作流程提升到一個新的水平!
如果您有產品試用下載、價格咨詢、優惠獲取,或其他任何問題,請聯系。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都網