我在Python中有以下布尔语句:
db_connection.query(
'select storage_time from traces where id=' + trace_id
).dictresult()[0]['storage_time'] == None
它基本上检查storage_time
中是否有值,我想在Matlab中做同样的事情,但我找不到与None无关的任何内容。
你能帮帮我吗?
由于
答案 0 :(得分:5)
等效于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的方式,让我们考虑以下示例。假设您必须检索一个查询的结果,该查询返回一个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
此处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);
因此仅检查isValueNullVec
就足够了。
答案 1 :(得分:1)
MATLAB的数据库工具箱具有如何处理NULL值的首选项。根据这些设置,您可以获得不同的值。有关详细信息,请参阅SETDBPREFS。你也可以change preferences in GUI。
默认情况下,如果将数据读取为数字,则将获得NaN;如果读取为字符串,则将获得“NULL”字符串。在第一种情况下,数字检查具有ISNAN功能的NaN。
null_idx = isnan(fetcheddata);
对于字符串使用STRCMP:
null_idx= strcmp(upper(fetcheddata), 'NULL');
答案 2 :(得分:0)
Matlab习语通常使用isempty()
函数。
isempty(somefunction(someargument))
如果true
返回任何空结果,则返回somefunction(someargument)
,否则返回false
。
我没有太多使用Matlab数据库工具箱,所以我不确定你的Python语句的完整翻译是什么。
答案 3 :(得分:0)
如果您使用此查询,则可以检查True
或False
而不是“无”:
trace_id_exists = db_connection.query("""\
select exists (
select 1
from traces
where id = %s
) "exists"
""" % trace_id
).dictresult()[0]['exists']
if trace_id_exists:
...
您还可以返回其他内容,例如1或0.