繁体   English   中英

tsql避免where子句中的错误

[英]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
)

一种选择是在FieldANULL的情况下将其合并为一个虚拟字符串:

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

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

现在,当FieldANULLIS NULL检查将首先被选中,或者子字符串条件将被首先选中。 在这两种情况下,对于NULL FieldAWHERE检查都将失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM