【问题标题】:Do SQL::Statement's REGEX and TRIM work with DBD::CSV?SQL::Statement 的 REGEX 和 TRIM 是否与 DBD::CSV 一起使用?
【发布时间】:2009-12-31 02:09:11
【问题描述】:

此脚本中的函数“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::语句:1.23

【问题讨论】:

  • 你有最新的 DBI、DBD::CSV、SQL::Statement 吗?

标签: sql perl dbi


【解决方案1】:

答案: 整洁的问题。我使用您的脚本在 5.10.0 下使用 SQL::Statement-1.23DBD::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 NB:您需要像我一样在s/// 中反斜杠该美元符号,以保留您的插值引号...

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

【讨论】:

  • 现在是我出柜的时候了:我不是so的母语为英语的成员。那么有人可以用其他词来解释一下“请在此模块的测试用例中提交错误”这句话吗?
  • @sid_com,感谢您的提问。 http://rt.cpan.org 跟踪发布在 CPAN 上的每个 perl 模块的缺陷报告,并且是记录 TRIM() 错误行为的合适位置。通过测试用例,我的意思是向 SQL::Statement 作者展示如何重现这些错误:您的代码、您期望它做什么以及它会做什么。
【解决方案2】:

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

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

【讨论】:

  • 没有数据库。它使用带有临时表的 DBD::CSV,这意味着所有内容都由 SQL::Statement::RAM 存储。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2017-05-28
    • 2011-02-28
    • 2022-11-30
    相关资源
    最近更新 更多