1

这个脚本中的函数“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::Sponge: 12.010002
DBD::CSV: 0.26
DBD::Gofer: 0.011565
DBD::DBM: 0.03
DBD::Proxy: 0.2004
DBI: 1.609
DBD::File: 0.37

SQL::语句:1.23

4

3 回答 3

2

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

  • REGEX()似乎有效,但返回一个number,而不是boolean,需要特别处理:

    使固定: 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 注意:您需要s///像我一样在 中反斜杠该美元符号,以保持您的插值引号......

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

于 2009-12-30T16:28:01.380 回答
1

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

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

于 2009-12-29T18:26:00.110 回答
1

你确定底层的 SQL 引擎(我猜是 DBI::SQL::Nano)已经实现了这些功能吗?最好选择数据并使用 Perl 进行处理。

于 2009-12-30T01:54:10.987 回答