Ste*_*ein 3 python sql postgresql matlab
我在Python中有以下布尔语句:
db_connection.query(
'select storage_time from traces where id=' + trace_id
).dictresult()[0]['storage_time'] == None
Run Code Online (Sandbox Code Playgroud)
它基本上检查是否有值storage_time,我想在Matlab中做同样的事情,但我找不到任何等同于None的东西.
你能帮帮我吗?
谢谢
等效于Python中的None值是NULL.而且,由于您通过Matlab Database Toolbox连接到数据库,因此需要指定如何在Matlab中显示从数据库中检索的NULL值.这可以'NullNumberRead'
通过setdbprefs从Matlab数据库工具箱调用函数来完成.例如,你可以这样做
setdbprefs('NullNumberRead','NaN')
Run Code Online (Sandbox Code Playgroud)
或者
setdbprefs('NullNumberRead','0')
Run Code Online (Sandbox Code Playgroud)
遗憾的是,无法保证以这种方式指定的NULL表示值不会与查询结果获得的实际非NULL值混淆(在这种情况下,您自己负责保证查询始终不包含NaNs或0,分别是其结果中的非NULL值).但是如果你必须连接到PostgreSQL,据我所知,至少存在一个以完全一致的方式尊重NULL的Matlab和PostgreSQL连接器.这是一个高性能的PostgreSQL客户端库PgMex.
在PostgreSQL中,值本身和值元素都可以为NULL(对于数组类型).这使得Matlab中NULL的表示不如预期的那么简单.
为了说明PgMex在Matlab中用于表示NULL的方式,让我们考虑以下示例.假设您必须检索返回一个具有两个元组myfield的float8[]类型字段的查询的结果.并且假设myfield第一个元组的值等于NULL本身,而对于第二个元组,相应的值等于{0,NULL,NaN}.结果如下获得(我们假定第一个命令的参数connect如下适当地校正,并且该表mytable包含
myfield的float8[]其字段中键入相应的数据库中已存在):
% 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
Run Code Online (Sandbox Code Playgroud)
下面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对于timestamp类型字段和已定义的变量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);
Run Code Online (Sandbox Code Playgroud)
因此,仅检查就足够了isValueNullVec.
编辑:PgMex有免费的学术许可证.
| 归档时间: |
|
| 查看次数: |
319 次 |
| 最近记录: |