栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

设置变量时,对记录的IS NOT NULL测试不会返回TRUE

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设置变量时,对记录的IS NOT NULL测试不会返回TRUE

我看到两个可能的原因,为什么…

这些加薪都没有出现在我的消息日志中

未登录

首先,

NOTICE
通常不会使用默认设置将a写入数据库日志。我在这里引用手册:

log_min_messages
enum

控制将哪些消息级别写入服务器日志。有效值为

DEBUG5
DEBUG4
DEBUG3
DEBUG2
DEBUG1
INFO
NOTICE
WARNING
ERROR
LOG
FATAL
,和
PANIC
。(…)
默认值为 WARNING 。请注意,
LOG
此处的排名与中的排名不同
client_min_messages

大胆强调我的。还请注意(手册中的上一项

NOTICE
)不同的默认值(
client_min_messages
)。

测试无效

其次,考虑如何对行表达式求值。当(且仅当) 每个元素 均为时,测试才

row_variable IS NULL
返回。给出以下示例:
TRUE

__
NULL

SELECt (1, NULL) IS NULL AS a     -- FALSE      ,(1, NULL) IS NOT NULL AS b -- also FALSE

这两个 表达式都返回

FALSE
。换句话说,行(或记录)变量
(1, NULL)
既不是
NULL
也不是
NOTNULL
。因此,您的两个测试均失败。

-> SQLfiddle, 有更多详细信息。

您甚至可以使用NULL(

rec :=NULL
)分配记录变量,如果该类型是众所周知的行类型,则结果将使每个元素都为NULL。否则,我们将处理一个匿名记录,并且该结构是未定义的,因此您将无法访问任何元素。但是
rowtype
在您的示例中并非如此(始终是众所周知的)。

解决方案:
FOUND

测试您是否收到来自a的行的正确方法是

SELECT * INTO
什么?

您必须考虑到该行即使已分配也可能为NULL。该查询很可能已经返回了一堆NULL值(如果查询中的表定义允许NULL值)。这样的测试在设计上将是不可靠的。

有一种简单而安全的方法。使用

GET DIAGNOSTICS ...
或(如果适用)特殊变量
FOUND

SELECT * FROM my_table WHERe owner_id = 6 INTO my_var;IF NOT FOUND THEN   RAISE NOTICE 'Query did not return a row!';END IF;

手册中的详细信息。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/517470.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号