sql - 用 nulliff 替换 NULL 返回不同的查询结果
问题描述
我正在尝试构建一个动态查询,我将传递一个参数,如果参数为空,则查询返回我在表中拥有的所有项目。第二个查询返回我在表中的所有项目。第一个查询返回的结果要短得多。
有任何想法吗?
select ...
where table.code = isnull(nullif('',''),table.code)
select ...
where table.code = isnull(null,table.code)
解决方案
这个简单的测试显示了问题:
SELECT ISNULL(NULLIF('', ''), 'TEST')
它没有像预期的那样返回 TEST,而是返回'T',因为第一个 NULLIF 返回 varchar(1) 类型的 null(其参数的类型),因此 ISNULL 的返回值也被强制转换为 varchar(1)。
我会简单地使用 COALESCE 而不是 ISNULL (它不会尝试将返回值转换为第一个值的类型):
SELECT COALESCE(NULLIF('', ''), 'TEST')
这个返回正确的值'TEST'。
因此,要修复您的查询,您只需将 ISNULL 替换为 COALESCE :
select ...
where table.code = coalesce(nullif('',''),table.code)
推荐阅读
- cpu-architecture - 计算机系统架构考试题帮助我
- r - 在矩阵值函数上使用 R 中的外部
- python - Python bytearray 从变异序列初始化
- android - RecyclerView 创建额外的空间,即使宽度是匹配父级并且高度是包装内容
- sql-server - 具有 OPENROWSET 多个条件的 LDAP ADSDSOObject
- javascript - 检查 2 个数组的值并将相似的值保存在第 3 个数组中
- java - 如果在 JavaFX 中单击了 HBox 中的按钮,如何获取 HBox
- javascript - 为什么使用 Django 时 Okta-React Login 会重定向到空白页面?
- javascript - 如何在铬中增加本地存储内存?
- vue.js - 在 CKedtior5 和 Vue2 中将自定义 CSS 类添加到元素 `.ck-content`