Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server ISNULL()返回NULL_Sql Server_Tsql_Sql Server 2012_Isnull - Fatal编程技术网

Sql server ISNULL()返回NULL

Sql server ISNULL()返回NULL,sql-server,tsql,sql-server-2012,isnull,Sql Server,Tsql,Sql Server 2012,Isnull,如果没有匹配的行(未被任何行满足),为什么下面的简单查询返回null 从[MyTable]中选择ISNULL(MyField,0),其中 我也尝试了COALESCE(),得到了类似的结果。没有匹配行时,如何返回零?使用以下方法: SELECT ISNULL(COUNT(MyField), 0) FROM [MyTable] WHERE <Condition> 从[MyTable]中选择ISNULL(计数(MyField),0),其中 如果缺少行,它将返回0。如果您希望条件将结果

如果没有匹配的行(
未被任何行满足),为什么下面的简单查询返回null

从[MyTable]中选择ISNULL(MyField,0),其中
我也尝试了
COALESCE()
,得到了类似的结果。没有匹配行时,如何返回零?

使用以下方法:

SELECT ISNULL(COUNT(MyField), 0) FROM [MyTable] WHERE <Condition>
从[MyTable]中选择ISNULL(计数(MyField),0),其中

如果缺少行,它将返回
0

如果您希望
条件
将结果集减少到0或1行,这将起作用:

SELECT ISNULL((SELECT MyField FROM [MyTable] WHERE <Condition>),0)
SELECT ISNULL((从[MyTable]中选择MyField,其中),0)

也就是说,创建一个不带
FROM
子句的外部查询(因此总是只生成一行)然后使用子查询获取0行或1行实际数据。

您不能使用任何sql内置函数将
0行
转换为
1行的空值
,因为这可能会导致数据的错误解释

但您可以使用以下逻辑自定义结果(与在.net中所做的相同)

If(从[MyTable]中选择计数(MyField)=0
选择0作为[MyField]
其他的
从[MyTable]中选择ISNULL(MyField,0)作为[MyField],其中

如果未满足
,则将没有行。使用
count(*)
将返回匹配行数,如果没有行,则显示
0
@Bharadwaj:我知道这一点,这就是我发布问题的原因。在这种情况下,如何返回零?使用
如果@ROWCOUNT>0…
请参阅
从[MyTable]中选择count(*),其中
将给出
0
如果没有行匹配,只需检查查询是否在程序逻辑中返回了行,但如果满足条件,它将返回count:)
COUNT
总是给出一个数字,决不能为null
,afaik@Bharadwaj当前位置你没有领会要点。我是说当条件满足时,它不会返回
MyField
。因此,这个解决方案并没有完全完成所讨论的查询需要做的事情。@DotNET我明白你的意思,我正在考虑这个问题。在我看来,您可能需要将
Exist()
if-else
blockBrilliant一起使用。这是一条直线,是一个简单问题的简单解决方案。然而,我确实想知道为什么应用于子查询时与应用于字段时,即使返回的行数在两种情况下都为零,
ISNULL
的行为也会有所不同。@dotNET-正如我所说,我的外部查询只有一行,而不是零行。
SELECT
子句描述了对其结果集中的每一行执行的操作。如果它要处理的行数为零,它将执行其工作零次。我现在明白了。非常感谢。
SELECT ISNULL((SELECT MyField FROM [MyTable] WHERE <Condition>),0)
If (select COUNT(MyField) FROM [MyTable] WHERE <Condition>)=0
select 0 as [MyField]
else
SELECT ISNULL(MyField, 0) as [MyField] FROM [MyTable] WHERE <Condition>