tsql避免where子句中的错误

时间:2016-07-13 10:36:29

标签: sql-server tsql

我有这样的查询(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为空引起的。

请帮忙。

2 个答案:

答案 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')

我使用的虚拟字符串是十个空格,后跟正斜杠,即__________/

现在当FieldANULL时,将首先点击IS NULL检查,或者首先点击子字符串条件。在这两种情况下,WHERE NULL的{​​{1}}检查都会失败。