[英]tsql Avoid errors in where clause
我有一个这样的查询(SQL Server):
UPDATE TableX set FieldB = 'SomeValue'
where
FieldA is not null and FieldC is not NULL and FieldB is null and FieldD > 0 and
substring(FieldA,5, CHARINDEX('/', FieldA, 5) - 5) in ('ValueA','ValueB')
问题在于,有时FieldA
为null,并且该查询在FieldA
上首次出现null时FieldA
,我不希望那样。
错误消息是:
无效的长度参数传递给LEFT或SUBSTRING函数。
它是由FieldA
为null引起的。
请帮忙。
我将final子句包装在括号中,并允许该值为NULL
,类似这样;
UPDATE TableX
set FieldB = 'SomeValue'
where
FieldA is not null
and FieldC is not NULL
and FieldB is null
and FieldD > 0
and
(
substring(FieldA,5, CHARINDEX('/', FieldA, 5) - 5) in ('ValueA','ValueB')
OR
FieldA IS NULL
)
如果您仍然遇到NULL
问题,则可能是因为CHARINDEX
可能返回负数(如果在数据中找不到'/')。 提供一些样本数据,您将获得其他答案。 请尝试下面的查询,该查询使用ABS()
函数;
UPDATE TableX
set FieldB = 'SomeValue'
where
FieldA is not null
and FieldC is not NULL
and FieldB is null
and FieldD > 0
and
(
substring(FieldA,5, ABS(CHARINDEX('/', ISNULL(FieldA,''), 5) - 5)) in ('ValueA','ValueB')
OR
FieldA IS NULL
)
一种选择是在FieldA
为NULL
的情况下将其合并为一个虚拟字符串:
UPDATE TableX
SET FieldB = 'SomeValue'
WHERE FieldA IS NOT NULL AND
FieldC IS NOT NULL AND
FieldB IS NULL AND
FieldD > 0 AND
SUBSTRING(COALESCE(FieldA, ' /'),
5,
CHARINDEX('/', COALESCE(FieldA, ' /'), 5) - 5)
IN ('ValueA','ValueB')
我使用的虚拟字符串是十个空格,后跟一个正斜杠,即__________/
现在,当FieldA
为NULL
, IS NULL
检查将首先被选中,或者子字符串条件将被首先选中。 在这两种情况下,对于NULL
FieldA
, WHERE
检查都将失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.