從 TSQL 連接字元串中刪除空值
我有一堆查詢,針對幾個不同的數據庫,用於生成分隔報告。我正在嘗試針對 MSSQL 數據庫創建一些新報告,並且在複製我們的其他流程以獲得一致的結果時遇到了麻煩。
當我查詢其他來源時,我得到 ’’ 和 0 來代替空值。當我查詢 MSSQL 時,我得到空值。
我正在使用 DSN 字元串 => ODBC => 遠端數據庫進行某些查詢…並使用直接連接字元串進行其他查詢。
所以針對 DB2 數據庫:
SELECT OrderID, CustomerName FROM OrderTable LEFT JOIN CustomerTable on OrderCustomerID = CustomerID
假設 CustomerTable 沒有 Customer,因此對於 OrderID 1,沒有 customerID 結果將是(輸出為 | 定界列表):
0|Joe Schmoe 1|NULL 2|Jane Doe
使用 DB2 時,我得到“1|”。使用 MSSQL 時,我得到“1|null”。
使用 ODBC、連接字元串、伺服器設置……我如何在 null 上返回“”或 0 以使輸出與我們的其他程序匹配?
我試過直接連接(沒有 DSN/ODBC)。我在 ODBC 中嘗試了不同的設置。所有三個 SQL 驅動程序(SQL Server、SQL Native Client、SQL Server Native Client 10.0)。所有返回的都是 NULL 而不是數據類型的“預設”。
更新/澄清 我正在使用“內部”ETL 程序,該程序主要通過分隔文本從內部數據庫中提取和轉換數據,以便導出到其他機構/客戶。以前我使用的所有查詢,當遇到空值時,都只是輸出“”/0。MSSQL 顯然不這樣做,所以我試圖在最通用的級別上模仿其他來源。
我了解 IsNull/Colesce 的工作原理,如果需要,我將使用這些來完成工作。使用 IsNull/Colesce 的明顯問題是添加的程式碼,涉及許多查詢。添加的程式碼意味著更難的維護、更多的創建時間、更多的故障點等。如果我可以簡單地告訴連接級別來替換所有空值,我會認為這會容易得多……但這使得問題成為可能? 如果是這樣怎麼辦?要麼在 SQL2005 Server 實例中,要麼在 ODBC 連接或連接字元串的連接的另一端。
在這種情況下,SQL Server 總是返回 NULL。我知道無法全域(通過伺服器設置或連接字元串)導致它返回空字元串或零而不是 NULL。而且我不認為這是一個數據庫庫問題——使用不同的驅動程序不會改變任何事情。這正是 SQL Server 的行為方式。
如果要將 NULL 轉換為其他值,則需要顯式使用
IsNull(Expression, ValueIfNull)
函式或類似Coalesce()
函式,該函式接受多個參數並返回第一個非空值。SELECT O.OrderID, IsNull(CustomerName, '') CustomerName FROM dbo.OrderTable O LEFT JOIN dbo.CustomerTable C ON O.OrderCustomerID = C.CustomerID
雖然有一條評論……為什麼會有沒有客戶的訂單?沒有訂單的客戶不是更有可能嗎?
更新
您可以在客戶端放入一個包裝器,將 NULL 轉換為您想要的嗎?您使用什麼過程或程序將結果集轉換為文本?