Sql-Server

LTRIM/RTRIM/ISNULL 的操作順序

  • June 21, 2018

結合使用時,您放置的操作順序是否LTRIM重要?例如,以下面的範例為例,使用者可能在欄位中輸入一堆空格,但我們將他們的輸入修剪為實際值以避免儲存空字元串。RTRIM``ISNULL``NULL

我正在執行以下TRIM操作ISNULL

DECLARE @Test1 varchar(16) = '    '

IF LTRIM(RTRIM(ISNULL(@Test1,''))) = ''
BEGIN
   SET @Test1 = NULL
END

SELECT @Test1

這會適當地返回一個真NULL值。現在讓我們放在ISNULL外面:

DECLARE @Test2 varchar(16) = '    '

IF ISNULL(LTRIM(RTRIM(@Test2)),'') = ''
BEGIN
   SET @Test2 = NULL
END

SELECT @Test2

這也返回一個NULL值。兩者都適用於預期用途,但我很好奇 SQL 查詢優化器如何處理這個有什麼不同?

你的測試是多餘的。首先,當給定 NULL 輸入時,LTRIM 和 RTRIM 都返回 NULL:

declare @Test1 varchar(16) = null;

select
   lft = LTRIM(@test1),
   rgt = RTRIM(@Test1);

lft              rgt
---------------- ----------------
NULL             NULL

其次,標準 SQL 在比較字元串時會忽略尾隨空格:

select
   A =case
       when '' = '   ' then 'equal'
   end,
   B = case
       when '  ' = '     ' then 'equal'
   end;

A     B
----- -----
equal equal

SQL Server 提供了NULLIF函式。這需要兩個參數。如果它們不同,則將返回第一個。如果它們相等,它將返回 NULL。我認為這將滿足您的要求。

declare @Test1 varchar(16) = '    ';

select
   first = nullif(@Test1, '');

set @Test1 = NULL;

select
   second = nullif(@Test1, '');

set @Test1 = 'some value';

select
   third = nullif(@Test1, '');

first
----------------
NULL

second
----------------
NULL

third
----------------
some value

您可能仍需要 LTRIM,具體取決於您的輸入驗證。

引用自:https://dba.stackexchange.com/questions/210066