我有这样的查询(SQL服务器):
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
为空,而FieldA
上第一次出现null时此查询失败,我不想这样做。
错误消息是:
传递给LEFT或SUBSTRING函数的长度参数无效。
由FieldA
为空引起的。
请帮忙。
答案 0 :(得分:2)
我将最后一个句子包装在括号中,并允许值为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
)
答案 1 :(得分:2)
一个选项是将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
检查,或者首先点击子字符串条件。在这两种情况下,WHERE
NULL
的{{1}}检查都会失败。