IF语句逻辑在TSQL中不起作用->我在做什么错了

时间:2018-07-15 20:45:04

标签: sql-server function tsql if-statement

自从我用T-SQL编码以来已有一段时间了,但是我有一个IF语句在函数中不起作用。这一定是我的逻辑问题,但我看不到。

如果有一条数据,@pTownship不是空白且为空,那么我正在测试它是否是一个,两个或三个字符,并将乡镇编号返回给调用的存储过程。以下是我的功能代码。

问题在于,当一条数据(例如05N)作为@pTownship传递时,外部IF不正确,否则正在执行else,因此我的内部IF条件是永远不会被执行。由于@pTownship是05N,因此不是”或NULL,那么为什么不执行我的真实条件?

预先感谢您的第二眼。

CREATE FUNCTION core.fnTownshipNumber (@pTownship VARCHAR(50)) 
RETURNS INT
AS
BEGIN
    DECLARE @TownshipNumber INT,
            @InputLength INT;

    IF @pTownship <> '' AND @pTownship <> NULL
    BEGIN
        SET @InputLength = LEN(@pTownship);

        -- single character, based on the data, single character is always number so return it
        IF @InputLength = 1
            SET @TownshipNumber = CONVERT(INT, @pTownship);

        -- double character, based on the data, double char are always number so return it
        IF @InputLength = 2
            SET @TownshipNumber = CONVERT(INT, @pTownship);

        -- triple character, based on the data, third char is always direction so return first two   
        IF @InputLength = 3
            SET @TownshipNumber = CONVERT(INT, SUBSTRING(@pTownship, 1, 2));
    END;
    ELSE
    BEGIN
        SET @TownshipNumber = NULL;
    END;

    RETURN @TownshipNumber;
END

3 个答案:

答案 0 :(得分:2)

<>运算符无意与NULL比较。当您需要检查NULL时,请使用

@pTownship IS NOT NULL

或者,如果您愿意,

NOT (@pTownship IS NULL)

相关:Not equal <> != operator on NULL

在您的情况下,您将同时比较空字符串和null,捕获这两种情况的更简洁方法是:

IF NULLIF(@pTownship, '') IS NOT NULL BEGIN
    /* ... */
END

如果使用此替代方法,则可以完全省略外部IF:

SET @InputLength = LEN(COALESCE(@pTownship, ''));

当第一个参数为NULL时,COALESCE函数将返回其第二个参数(示例中的空字符串)。

答案 1 :(得分:1)

我认为您可能需要使用以下表格:

IF (@pTownship IS NOT NULL) AND (LEN(@pTownship) > 0)

我对第二个任期不确定。变化也可能有效。也许可以省略括号,但我可能希望保留它们。

对此,请参见How do check if a parameter is empty or null in Sql Server stored procedure in IF statement?

答案 2 :(得分:0)

下面显示了另一种通过case 表达式(不是声明)实现逻辑的方法。

第一个del以清晰的方式实现了逻辑,尽管由于case作为包罗万象的子句,实际上并不需要初始的when子句。第二种变体利用了else(或Left())允许的长度大于输入的长度:它只是简单地返回整个字符串而没有错误。

Substring()