微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – Matlab检查数据库中的值

我在Python中有以下布尔语句:

db_connection.query(
   'select storage_time from traces where id=' + trace_id
).dictresult()[0]['storage_time'] == None

它基本上检查storage_time中是否有值,我想在Matlab中做同样的事情,但我找不到任何等同于None的东西.

你能帮帮我吗?

谢谢

解决方法:

等效于Python中的None值是NULL.并且因为您连接到您的数据库
通过Matlab数据库工具箱,您需要指定如何从数据库中检索NULL值
将在Matlab中呈现.这可以通过设置’NullNumberRead’来完成
通过从Matlab数据库工具箱调用setdbprefs函数.例如,你可以这样做

setdbprefs('NullNumberRead','NaN')

或者

setdbprefs('NullNumberRead','0')

不幸的是,不能保证这种方式指定的NULL表示值不会混淆
由于您的查询获得了真正的非NULL值(在这种情况下,您自己负责
保证查询始终不会在其结果中的非NULL值中包含NaN或零.
但是如果你必须连接到Postgresql,据我所知,至少存在一个Matlab和Postgresql连接器,
以完全一致的方式尊重NULL.这是一个性能的Postgresql客户端库PgMex.

在Postgresql中,值本身和值元素都可以为NULL(对于数组类型).这使得Matlab中NULL的表示不如预期的那么简单.

为了说明pgmex在Matlab中用于表示NULL的方式,让我们考虑以下示例.假设您必须检索一个查询的结果,该查询返回一个具有两个元组的float8 []类型的字段myfield.并且假设第一个元组的myfield值等于NULL本身,而对于第二个元组,相应的值等于{0,NULL,NaN}.结果如下获得
(我们假设下面连接的第一个命令的参数已正确更正,并且表mytable包含
其字段中的float8 []类型的myfield已经存在于相应的数据库中):

% Create the database connection
dbConn=com.allied.pgmex.pgmexec('connect',[...
    'host=<yourhost> dbname=<yourdb> port=<yourport> '...
    'user=<your_postgres_username> password=<your_postgres_password>']);

pgResult=com.allied.pgmex.pgmexec('exec',dbConn,...
    'select myfield from mytable'); % perform the query

SMyField=com.allied.pgmex.pgmexec('getf',pgResult,...
    '%float8[]',0); % retrieve the results

这里SMyField是一个包含三个字段的结构:valueVec,isNullVec和isValueNullVec.
isValueNullVec等于列逻辑数组[true; false],即第一个元组的整个值等于NULL,
而第二个元组的值不等于NULL本身. isNullVec等于以下列单元格数组:
{[]; [FALSE,TRUE,FALSE]}.通过这种方式,可以指示只有数组的第二个元素是值
myfield的第二个元组是NULL.最后,valueVec等于列单元格数组{[]; [0 0 NaN]}.只要
与该阵列的第二个元素相比,第二个单元的第一个和第三个元素是相关的.
这是因为isNullVec清楚地表明第二个元素是NULL,所以这个零值无关紧要
(为每种特定数据类型选择一些认值).

关于您的示例,Matlab中的相应代码可能如下(我们假设上面获得的dbConn已经存在
以及下面的查询是正确的,时间戳类型的storage_time字段和已定义的变量trace_id):

pgResult=com.allied.pgmex.pgmexec('exec',dbConn,...
    ['select storage_time from traces where id=' + trace_id]); % perform the query
sstorageTime=com.allied.pgmex.pgmexec('getf',pgResult,...
    '%timestamp',0); % retrieve the results
% check that the value for the first tuple is not NULL
isstorageTime=~sstorageTime.isValueNullVec(1);

因此,仅检查isValueNullVec就足够了.

编辑:有PgMex免费学术许可证.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐