3

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

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

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

你能帮帮我吗?

谢谢

4

4 回答 4

5

相当于 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存在 于相应的数据库中):myfieldfloat8[]

% 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是一个具有三个字段的结构valueVecisNullVecisValueNullVecisValueNullVec等于列逻辑数组[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有免费的学术许可证。

于 2017-07-22T13:46:29.223 回答
1

MATLAB 的数据库工具箱具有如何处理 NULL 值的首选项。根据这些设置,您可以获得不同的值。有关详细信息,请参阅SETDBPREFS。您也可以在 GUI 中更改首选项

默认情况下,如果您将数据读取为数字,您将获得 NaN,如果您读取为字符串,则会获得“NULL”字符串。在第一种情况下,使用ISNAN函数检查 NaN 。

null_idx = isnan(fetcheddata);

对于字符串使用STRCMP

null_idx= strcmp(upper(fetcheddata), 'NULL');

此外,如果您以元胞数组的形式获取数据,您可能需要使用 CELLFUN 处理它们或使用CELL2MAT转换为矩阵。

于 2013-02-21T20:30:37.023 回答
0

如果您使用此查询,您可以检查Trueor Falsein 而不是 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。

于 2013-02-21T16:38:54.500 回答
0

Matlab的习语通常是使用isempty()函数。

isempty(somefunction(someargument))

true如果返回somefunction(someargument)任何空结果,则返回,false否则返回。

我没有太多使用 Matlab DB 工具箱,所以我不确定你的 Python 语句的完整翻译是什么。

于 2013-02-21T16:38:14.473 回答