Sql server @GuidoG如果@Test为空,则将跳过If语句,这是所需的行为。测试不是冗余的。如果Test为null,那么if Test>0的结果会是什么呢?如果@Test>0就足够了,除非@Test为null时你没有其他行为,否则我建议尝试类似“select ca

Sql server @GuidoG如果@Test为空,则将跳过If语句,这是所需的行为。测试不是冗余的。如果Test为null,那么if Test>0的结果会是什么呢?如果@Test>0就足够了,除非@Test为null时你没有其他行为,否则我建议尝试类似“select ca,sql-server,tsql,Sql Server,Tsql,@GuidoG如果@Test为空,则将跳过If语句,这是所需的行为。测试不是冗余的。如果Test为null,那么if Test>0的结果会是什么呢?如果@Test>0就足够了,除非@Test为null时你没有其他行为,否则我建议尝试类似“select case when null>5或null@GuidoG if@Test为null,那么if语句将被跳过,这是期望的行为。事实上,它们的计算结果不是false,而是null,它被强制转换为false,但这并不能改变事实,你必须检查它。是的,很抱歉有



@GuidoG如果
@Test
为空,则将跳过
If
语句,这是所需的行为。测试不是冗余的。如果Test为null,那么if Test>0的结果会是什么呢?
如果@Test>0
就足够了,除非@Test为null时你没有其他行为,否则我建议尝试类似“select case when null>5或null@GuidoG if
@Test
为null,那么
if
语句将被跳过,这是期望的行为。事实上,它们的计算结果不是false,而是null,它被强制转换为false,但这并不能改变事实,你必须检查它。是的,很抱歉有点错误的措辞。比较的结果为空,这不是布尔值TRUE。@Pred在本例中,您为什么说“您必须检查它?”@Michaelmullin我当时很忙,没有对原始问题给予足够的注意,处理空值也不是一个坏做法。这是一个简短的故事。事实上,它们的计算结果不是false,而是null,它被转换为false,但这并不能改变事实,你必须检查它。是的,很抱歉,这个措辞有点错误。比较的结果为空,这不是布尔值TRUE。@Pred在本例中,您为什么说“您必须检查它?”@Michaelmullin我当时很忙,没有对原始问题给予足够的注意,处理空值也不是一个坏做法。这是一个短篇故事。是的,这是一个很好的观点。碰巧的是,到目前为止,我所看到的代码都没有遵循这种特定的形式,但这肯定是一个需要注意的用例。我接受这一点作为答案,因为它通过提供一个合理的场景直接解决了这个问题,在这个场景中,不检查NULL可能会导致意外的结果。感谢大家的贡献,提出了很多有用的观点。是的,这是一个伟大的观点。碰巧的是,到目前为止,我所看到的代码都没有遵循这种特定的形式,但这肯定是一个需要注意的用例。我接受这一点作为答案,因为它通过提供一个合理的场景直接解决了这个问题,在这个场景中,不检查NULL可能会导致意外的结果。感谢大家的贡献,提出了很多有用的观点。感谢Matt提供的详细示例,非常有用。我想对我来说(至少在原始问题相对简单的用例中)的价值在于清晰。通常,正如您所说,这是通过显式实现的,但是我正在使用的代码充斥着
NULL
检查,可以说这在某种程度上掩盖了它的更大用途。看起来,唯一需要处理的情况是正整数,所以我怀疑我不需要对
NULL
检查过于谨慎。在这种情况下,您认为两个示例中哪一个更清晰?我认为“IF ISNULL(@Test,0)>0”是最简洁、最清晰的。它是精益代码的混合体,使您明确了如何处理空值的意图。感谢Matt提供的详细示例,非常有用。我想对我来说(至少在原始问题相对简单的用例中)的价值在于清晰。通常,正如您所说,这是通过显式实现的,但是我正在使用的代码充斥着
NULL
检查,可以说这在某种程度上掩盖了它的更大用途。看起来,唯一需要处理的情况是正整数,所以我怀疑我不需要对
NULL
检查过于谨慎。在这种情况下,您认为两个示例中哪一个更清晰?我认为“IF ISNULL(@Test,0)>0”是最简洁、最清晰的。它是精益代码的混合体,使您明确了如何处理空代码的意图。
IF @Test IS NOT NULL AND @Test > 0
    -- do something...
IF @Test > 0
    -- do something...
declare @t int
set @t=null
if (@t>0) print '1' -- works fine
if (@t<0) print '2' --works fine

if (@t>0) 
    print '3' --works fine
else print '4' --here we start getting problems, because we are sure that @t<=0 that is obviously not true
if isnull(@test, 0) > 0
DECLARE @Table1 AS TABLE (Col INT)
DECLARE @Table2 AS TABLE (Col INT)
INSERT INTO @Table1 VALUES (1),(2),(3)
INSERT INTO @Table2 VALUES (1),(NULL),(3),(4)

SELECT *
FROM
    @Table1 t1
    INNER JOIN @Table2 t2
    ON t1.Col <> t2.Col
DECLARE @Table1 AS TABLE (Col INT)
DECLARE @Table2 AS TABLE (Col INT)
INSERT INTO @Table1 VALUES (1),(2),(3),(NULL)
INSERT INTO @Table2 VALUES (1),(NULL),(3),(4)

SELECT *
FROM
    @Table1 t1
    INNER JOIN @Table2 t2
    ON t1.Col = t2.Col
DECLARE @Table1 AS TABLE (Col INT)
INSERT INTO @Table1 VALUES (1),(2),(3),(NULL)

SELECT *, CASE WHEN Col < 2 THEN Col ELSE 1000 END as ColCase
FROM
    @Table1 t1