SQL :: Statement的REGEX和TRIM是否与DBD :: CSV一起使用?

时间:2009-12-29 16:33:39

标签: sql perl dbi

此脚本中的“REGEX()”和“TRIM()”函数无法正常工作。 REGEX函数返回true,TRIM函数返回“trim_char”,而不是修剪后的字符串。 (当我用FROM而不是“,”编写TRIM函数时,我收到一条错误消息。)

#!/usr/bin/perl
use warnings;
use strict;
use 5.010;
use DBI;

my $dbh = DBI->connect( "DBI:CSV:", undef, undef, { RaiseError => 1, AutoCommit => 1 } );
my $table = 'artikel';

my $array_ref = [   [ 'a_nr', 'a_name', 'a_preis' ],  
                [ 12, 'Oberhemd', 39.80, ],
                [ 22, 'Mantel', 360.00, ],
                [ 11, 'Oberhemd', 44.20, ],
                [ 13, 'Hose', 119.50, ],
        ];
$dbh->do( "CREATE TEMP TABLE $table AS IMPORT(?)", {}, $array_ref );
say "";

# purpose   : test if a string matches a perl regular expression
# arguments : a string and a regex to match the string against
# returns   : boolean value of the regex match
# example   : ... WHERE REGEX(col3,'/^fun/i') ... matches rows
#             in which col3 starts with "fun", ignoring case
my $sth = $dbh->prepare( "SELECT a_name FROM $table WHERE REGEX( a_name, '/^O/')" );
$sth->execute();
$sth->dump_results();
say "\n";


# TRIM ( [ [LEADING|TRAILING|BOTH] ['trim_char'] FROM ] string )
$sth = $dbh->prepare( "SELECT a_name, TRIM( TRAILING 'd', a_name ) AS new_name FROM $table" );
$sth->execute();
$sth->dump_results();
say "";


$dbh->disconnect();

有人建议吗?

编辑:

DBD :: SQLite:1.25
DBD :: ExampleP:12.010007
DBD ::海绵:12.010002
DBD :: CSV:0.26
DBD :: Gofer:0.011565
DBD :: DBM:0.03
DBD ::代理:0.2004
DBI:1.609
DBD ::文件:0.37

SQL :: Statement:1.23

3 个答案:

答案 0 :(得分:2)

答案:整洁的问题。使用您的脚本在5.10.0下使用 SQL :: Statement-1.23 DBD :: CSV 进行测试的简短答案:

  • REGEX()似乎有效,但会返回数字,而不是布尔,需要特别处理:

    <强>修正: SELECT a_name FROM $table WHERE REGEX( a_name, '/^O/') = 1

  • TRIM()不会使用逗号(如您的示例所示);然而,对我来说似乎无法解决。

    在我的测试中,TRIM( FROM )的任何使用都极大地混淆了关于表名的解析器,并且正如您所发现的那样,任何其他有趣的用法似乎都解析为字符串文字。

    解决方法: SELECT a_name, REPLACE(a_name, 's/d\$//') AS new_name FROM $table N.B。:你需要反复使用s///中的美元符号,以保留插值报价...

上诉:请为此模块提供包含测试用例的错误。 SQL :: Statement 可能还没有准备好作为SQL引擎的黄金时间,但我们可以帮助实现它!

答案 1 :(得分:1)

您应该将代码简化为显示问题所需的最小示例,然后将您获得的结果与在DB的命令行界面中键入这些命令时所发生的结果进行比较。 (例如,尝试比较一个简单的“SELECT TRIM(...)”命令。

此外,您使用的是什么数据库和版本?

答案 2 :(得分:1)

您确定底层SQL引擎(我猜是DBI :: SQL :: Nano)是否实现了这些功能?最好选择数据并使用Perl处理它。