此脚本中的“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
答案 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处理它。