Matlab检查数据库中的值

时间:2013-02-21 16:10:03

标签: python sql matlab postgresql

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

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

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

你能帮帮我吗?

由于

4 个答案:

答案 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是一个包含三个字段的结构: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有免费的学术许可证。

答案 1 :(得分:1)

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

默认情况下,如果将数据读取为数字,则将获得NaN;如果读取为字符串,则将获得“NULL”字符串。在第一种情况下,数字检查具有ISNAN功能的NaN。

null_idx = isnan(fetcheddata);

对于字符串使用STRCMP

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

此外,如果您将数据作为单元格数组获取,则可能需要使用CELLFUN处理这些数据,或使用CELL2MAT转换为矩阵。

答案 2 :(得分:0)

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

isempty(somefunction(someargument))
如果true返回任何空结果,则

返回somefunction(someargument),否则返回false

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

答案 3 :(得分:0)

如果您使用此查询,则可以检查TrueFalse而不是“无”:

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.