我在 Python 中有以下布尔语句:
db_connection.query(
'select storage_time from traces where id=' + trace_id
).dictresult()[0]['storage_time'] == None
它基本上检查是否有值storage_time
,我想在 Matlab 中做同样的事情,但我找不到任何与 None 等效的东西。
你能帮帮我吗?
谢谢
我在 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 中呈现。这可以通过从 Matlab 数据库工具箱中'NullNumberRead'
调用函数来设置。setdbprefs
例如,您可以这样做
setdbprefs('NullNumberRead','NaN')
或者
setdbprefs('NullNumberRead','0')
不幸的是,不能保证通过这种方式指定的 NULL 表示值不会与作为查询结果获得的真实非 NULL 值混淆(在这种情况下,您自己有责任保证查询始终不包含NaNs 或零,分别在其结果中的非 NULL 值中)。但是,如果您必须连接到 PostgreSQL,据我所知,至少存在一个 Matlab 和 PostgreSQL 连接器,它以完全一致的方式尊重 NULL。这是一个高性能 PostgreSQL 客户端库PgMex。
在 PostgreSQL 中,值本身和值元素都可以为 NULL(对于数组类型)。这使得 Matlab 中 NULL 的表示没有预期的那么简单。
为了说明 PgMex 在 Matlab 中用来表示 NULL 的方式,让我们考虑以下示例。假设您必须检索一个查询的结果,该查询返回一个具有两个元组myfield
的类型字段。float8[]
并假设myfield
第一个元组的值本身等于 NULL,而第二个元组的相应值等于{0,NULL,NaN}
。结果如下(我们假设connect
下面第一个命令的参数已正确更正,并且其字段中包含 type 的表已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
。
编辑: PgMex有免费的学术许可证。
MATLAB 的数据库工具箱具有如何处理 NULL 值的首选项。根据这些设置,您可以获得不同的值。有关详细信息,请参阅SETDBPREFS。您也可以在 GUI 中更改首选项。
默认情况下,如果您将数据读取为数字,您将获得 NaN,如果您读取为字符串,则会获得“NULL”字符串。在第一种情况下,使用ISNAN函数检查 NaN 。
null_idx = isnan(fetcheddata);
对于字符串使用STRCMP:
null_idx= strcmp(upper(fetcheddata), 'NULL');
如果您使用此查询,您可以检查True
or False
in 而不是 None:
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。
Matlab的习语通常是使用isempty()
函数。
isempty(somefunction(someargument))
true
如果返回somefunction(someargument)
任何空结果,则返回,false
否则返回。
我没有太多使用 Matlab DB 工具箱,所以我不确定你的 Python 语句的完整翻译是什么。