c# - 通过 Oracle 命令参数在 where 子句中传递 null
问题描述
使用以下 Oracle 查询通过 oracle 命令参数获取数据。
从 tbl_name 中选择 count(*) 其中 col_name = :col_name
如果我将 :col_name 值作为“某个值”传递,它的工作并返回一些计数。如果 :col_name 为空,则它不起作用。因为在 where 子句 col_name = null 是不正确的。相反,我们需要使用 col_name 为 null。
如何从 c# 实现这一点,基于 col_name 值我需要使用正确的查询。
col_name = 'some value' :从 tbl_name 中选择 count( ) col_name = :col_name col_name = null :从 tbl_name 中选择 count( ) 其中 col_name 为 null
如何在一个查询中实现这一点。如果 col_name 为 null,则需要使用第二个 where 子句查询,否则需要使用第一个 where 子句查询。
提前致谢
解决方案
您必须在查询中使用IS NULL
orIS NOT NULL
来选择或排除 NULL 值:
Select count(*) from tbl_name where col_name IS NULL
SQL、语言和所有使用它的数据库都使用三值逻辑。任何布尔表达式都返回 True、False 和 NULL。与编程语言不同,NULL
它不是一个特定的值。NULL
表示该值为 UNKNOWN。也许是因为它丢失了,或者因为没有有意义的价值可以存储。
如果将一个 UNKNOWN 值与另一个值进行比较,则结果只能是 UNKNOWN。因此,如果一个值为 NULL,则结果也是 NULL。如果name
为 null,则两者都name = NULL
将name != NULL
返回 NULL,从不返回True
或False
。
在过滤(即 WHERE、HAVING)和 JOIN 中,NULL 被视为False
,因此您的查询将永远不会匹配NULL
值。毕竟,您询问了与特定条件匹配的所有行,而其中一些行的答案是I don't know if this matches or not
. 这些是否应该包含在结果中?I don't know
. 该语言无法猜测,因此它要求程序员明确说明是否应包含未知结果
推荐阅读
- javascript - 是否有 ESLint 规则来防止 `Promise
` to `boolean` 强制转换 - typescript-compiler-api - 打字稿转换器,`node.parent`未定义
- mysql - 无法使用外键 Maria DB 创建表
- python - Python:对 2d ndarray 进行排序并返回元组中的索引列表
- swift - UIDatePicker的变年箭头的动画过渡
- python - 手动查找质心和标记数据点之间的距离
- javascript - 如何使用`ws`库将此请求发送到websockets
- c - 即使我在顶部写了 char 答案,为什么我仍然第一次使用此函数错误?
- sendgrid - SendGrid 电子邮件活动 API 速率限制
- python - ValueError:没有为任何变量提供梯度 - Tensorflow 2.0