为什么 SQL Server 中条件为真时,即使第一种情况也会执行 else 部分?

问题描述 投票:0回答:1
SELECT
    CASE                      
       WHEN CHARINDEX('$','$2,500') > 0              
           THEN
               CASE 
                   WHEN CHARINDEX(' ','$2,500', CHARINDEX('$','$2,500') + 2) > 0  
                       THEN SUBSTRING('$2,500', CHARINDEX('$', '$2,500'), CHARINDEX(' ', '$2,500', CHARINDEX('$', '$2,500') + 2) - CHARINDEX('$', '$2,500'))              
                       ELSE SUBSTRING('$2,500', CHARINDEX('$', '$2,500'), LEN('$2,500') - CHARINDEX('$', '$2,500') + 1)           
               END                
           ELSE '$2,500'                      
    END

我有一个类型为

varchar
的变量,它可能在数字后面包含一些随机单词,所以我要做的是如果变量在数字后面包含空格(空格也可能在$后面,所以我们不必考虑这一点)然后从 $ 符号开始直到数字后面的空格处取子字符串。

但是在上面的情况下,没有空格,所以它应该进入 if 部分,这基本上是正常的,但它给出了无效的长度参数传递错误。

SELECT
    CASE                      
        WHEN CHARINDEX('$', '$2,500') > 0              
            THEN
                CASE 
                    WHEN CHARINDEX(' ', '$2,500', CHARINDEX('$', '$2,500') + 2) > 0  
                        THEN SUBSTRING('$2,500', CHARINDEX('$', '$2,500'), CHARINDEX(' ', '$2,500', CHARINDEX('$', '$2,500') + 2) - CHARINDEX('$', '$2,500'))              
                        ELSE SUBSTRING('$2,500', CHARINDEX('$', '$2,500'), LEN('$2,500') - CHARINDEX('$', '$2,500') + 1) 
                END                
            ELSE '$2,500'                      
    END
sql-server function runtime-error substring case
1个回答
0
投票

您向 substring 函数传递了一个错误的参数,即使该函数最终没有出现在您的执行路径中。它仍然必须正确输入等等。

从文档(上面的链接)来看,“length”参数“是一个正整数或bigint表达式,指定将返回表达式的多少个字符。如果length为负数,则会生成错误并终止语句。 “

您可以在这里查看问题:

SELECT CASE WHEN 1=0 THEN SUBSTRING('$2,500',1,-5) ELSE 'Success' END

它抛出同样的错误。

传递给子字符串函数的长度参数无效。

因为您无法将负值传递给

length
函数的
substring()
参数,所以您需要在 sql 中使用如下所示的内容来解释这一点:

THEN SUBSTRING('$2,500', CHARINDEX('$', '$2,500'), GREATEST(CHARINDEX(' ', '$2,500', CHARINDEX('$', '$2,500') + 2) - CHARINDEX('$', '$2,500'), 0))  

在这里工作dbfiddle

© www.soinside.com 2019 - 2024. All rights reserved.