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 [〜#〜] 関数を提供します。これは2つのパラメーターを取ります。それらが異なる場合、最初のものが返されます。それらが等しい場合、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が必要な場合があります。
SQL Serverは関数を完全に評価します。最初の例は次と同等です。
DECLARE @Test1 varchar(16) = ' '
SET @Test1 = ISNULL(@Test1,'')
SET @Test1 = RTRIM(@Test1)
SET @Test1 = LTRIM(@Test1)
IF @Test1 = ''
BEGIN
SET @Test1 = NULL
END
SELECT @Test1
ISNULL
は最初のNULL以外の値を返すだけなので、関数は@Test1
を返すだけです。次に、空白を削除します。これらの順序を逆にすると、ISNULL
は常にFALSEと評価されるため、まったく同じように動作します。
説明されている目的では、順序はほとんど関係ありません。 ISNULL
関数は、空白のトリミングについてドントケアの場合にのみ必要で、逆も同様です(LTRIM
/RTRIM
が何もしない場合) NULL値に)。