结合使用时您放置的操作顺序是否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:
其次,标准 SQL 在比较字符串时会忽略尾随空格:
SQL Server 提供了NULLIF函数。这需要两个参数。如果它们不同,则将返回第一个。如果它们相等,它将返回 NULL。我认为这将满足您的要求。
您可能仍需要 LTRIM,具体取决于您的输入验证。
SQL Server 将从内到外评估函数。您的第一个示例等效于:
由于
ISNULL
只返回第一个非 NULL 值,因此该函数只返回@Test1
. 然后它继续修剪空白。如果您颠倒这些顺序,它将以完全相同的方式行事,因为ISNULL
将始终评估为 FALSE。出于您所描述的目的,该顺序在很大程度上是无关紧要的。该函数仅在您不关心
ISNULL
修剪空白的情况下才需要,反之亦然(因为/对 NULL 值不做任何事情)。LTRIM
RTRIM