SQL Server 替换未返回预期结果

Jua*_*lez 2 sql-server

下面的代码不应该返回0吗?

SELECT REPLACE(ISNULL('',0),'',0)
Run Code Online (Sandbox Code Playgroud)

这也不返回0....

SELECT REPLACE('','',0)
Run Code Online (Sandbox Code Playgroud)

我在包含数值的表中有一个 nvarchar 字段,但有时为空(不为空)。

我有一个查询,检查该字段是否<另一个字段中的数字,但我得到

“将数据类型 nvarchar 转换为数字时出错。”

如果该字段为空,则会出错。我试图在查询执行期间将空白值 ('') 转换为零,这样我就不会收到转换错误,但我刚刚意识到

SELECT REPLACE('','',0)
Run Code Online (Sandbox Code Playgroud)

不会将空白字段转换为 0。

我尝试使用下面的代码来尝试避免转换错误,但是当阈值字段为空时它没有像我预期的那样评估为 0:

SELECT CAST(REPLACE(ISNULL(Threshold,0),'',0) as decimal(4,2))
Run Code Online (Sandbox Code Playgroud)

当阈值字段为空时,如何让代码评估为 0。

我猜我可以写一个 if 或 case 语句来跳过空白 ('') 值阈值,但我认为必须有一种方法可以全部内联,就像我试图用上面的代码做的那样.

Mar*_*ith 5

ISNULL('','0')
Run Code Online (Sandbox Code Playgroud)

返回第一个参数''(原样not null)所以你的问题归结为问为什么

SELECT REPLACE('','','0')
Run Code Online (Sandbox Code Playgroud)

不回0

REPLACE状态文件

string_pattern是要查找的子字符串。string_pattern 可以是字符或二进制数据类型。string_pattern 不能是空字符串 (''),并且不能超过适合页面的最大字节数。

TSQL 在这方面并不罕见。

在 C# 中尝试"Some String".Replace("", "0")会给出错误“字符串不能为零长度”。

这并不奇怪,因为在任何文本字符串中,您都可以争辩说有无限多个空字符串。

这句话开头的“T”和“h”之间可能有 20 个。由于它们的长度为零,我们怎么知道?

对于您的实际用例,您可以使用

SELECT CASE
         WHEN Threshold <> ''
           THEN CAST(Threshold AS DECIMAL(4, 2)) --Not null and not empty string
         ELSE 0
       END
Run Code Online (Sandbox Code Playgroud)