从 Informix table 中选择所有包含一些空列的行

Selecting all rows from Informix table containing some null columns

我正在使用 Perl DBD::ODBC 连接到一个 Informix 数据库,我以前不知道它的架构。我已经通过查询 tabname 和 colname tables 成功地发现了模式。我现在正在迭代每个 tables 提取其中的所有内容以加载到另一个模型中。我发现的是 select 查询中的空列。例如。如果 table 看起来像这样,有一个可选的空 lastseen 列(任何数据类型):

ID    username    lastseen
--    --------    --------
1     joe         1234567890
2     bob         1098765432
3     mary        
4     jane        1246803579

然后 select * from mytable(或单独指定所有列名)在 mary 行停止。

我确实通过使用 NVL 进行了如下操作:

select nvl(id, ''), nvl(username, ''), nvl(lastseen, '') from mytable

那是没问题,但是我的问题是:是否有更简单的 Informix 语法允许空值进入我的结果集,像 NULLS OK 这样简单的东西还是我遗漏的东西?或者,一些数据库句柄选项允许相同?

这是我的 Perl 的 nvl() hack 示例,以防相关:

my %tables = (
    users => [
        qw(id username lastseen)
    ]
);

foreach my $tbl (sort keys %tables) {
    my $sql = 'select ' . join(',', map { "nvl($_, '')" } @{$tables{$tbl}}) . " from $tbl";
    # sql like: select nvl(a, ''), nvl(b, ''), ...
    my $sth = $dbh->prepare($sql);
    $sth->execute;
    while(defined(my $row = $sth->fetchrow_arrayref)) {
        # do ETL stuff with $row
    }
}

检查 this - Perl 中的 NULL 部分。看来这个驱动没有简单的方法来处理这个问题。

在尝试安装 DBD::Informix 失败后,我回过头来发现由于某种原因,在数据库句柄上启用 LongTruncOk 确实允许选择所有行,包括那些具有空列的行.我不认为这是问题的根源,但它在这里起作用。

但是,此解决方案似乎与语言环境支持非 ASCII 字符的不相关调整相冲突。我在我的连接字符串中添加了 DB_LOCALE=en_us.utf8CLIENT_LOCALE=en_us.utf8 以防止选择在遇到非 ascii 字符时类似地中断(即,在结果集中说 500,其中第 300 行有一个非 ascii 字符不会返回尾随的 200 行)。以这种方式设置语言环境并在 dbh 上启用 LongTruncOk 所有行都将被返回(没有 NVL hack),但是空列从前面的行中添加了字节,而不是任何模式这对我来说是显而易见的。当我离开连接字符串的区域设置并设置 LongTruncOk 时,具有空列的行被正确选择但具有 utf 字符的行中断。

因此,如果您没有字符集问题,也许 LongTruncOk 对您有用。出于我的目的,我不得不继续对空值使用 NVL 解决方法并为字符指定语言环境。