从 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.utf8
和 CLIENT_LOCALE=en_us.utf8
以防止选择在遇到非 ascii 字符时类似地中断(即,在结果集中说 500,其中第 300 行有一个非 ascii 字符不会返回尾随的 200 行)。以这种方式设置语言环境并在 dbh 上启用 LongTruncOk
所有行都将被返回(没有 NVL
hack),但是空列从前面的行中添加了字节,而不是任何模式这对我来说是显而易见的。当我离开连接字符串的区域设置并设置 LongTruncOk
时,具有空列的行被正确选择但具有 utf 字符的行中断。
因此,如果您没有字符集问题,也许 LongTruncOk
对您有用。出于我的目的,我不得不继续对空值使用 NVL
解决方法并为字符指定语言环境。
我正在使用 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.utf8
和 CLIENT_LOCALE=en_us.utf8
以防止选择在遇到非 ascii 字符时类似地中断(即,在结果集中说 500,其中第 300 行有一个非 ascii 字符不会返回尾随的 200 行)。以这种方式设置语言环境并在 dbh 上启用 LongTruncOk
所有行都将被返回(没有 NVL
hack),但是空列从前面的行中添加了字节,而不是任何模式这对我来说是显而易见的。当我离开连接字符串的区域设置并设置 LongTruncOk
时,具有空列的行被正确选择但具有 utf 字符的行中断。
因此,如果您没有字符集问题,也许 LongTruncOk
对您有用。出于我的目的,我不得不继续对空值使用 NVL
解决方法并为字符指定语言环境。