自从我用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
答案 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()