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

回答:きちんとした問題です。SQL::Statement-1.23およびDBD::CSVを 5.10.0 でスクリプトを使用してテストした短い回答:

  • 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 注:s///補間引用符を保持するには、私が持っているように、そのドル記号をバックスラッシュする必要があります...

アピール: このモジュールのテスト ケースでバグを報告してください。 SQL::Statementは、SQL エンジンとしてのプライム タイムの準備ができていない可能性がありますが、その実現を支援することができます!

于 2009-12-30T16:28:01.380 に答える
1

基盤となる SQL エンジン (DBI::SQL::Nano だと思います) がこれらの関数を実装していると確信していますか? データを選択し、Perl を使用して処理するのが最善の場合があります。

于 2009-12-30T01:54:10.987 に答える
1

問題を示すのに必要な最小限の例にコードを要約し、得られた結果を、これらのコマンドを DB のコマンド ライン インターフェイスに入力したときに何が起こるかを比較する必要があります。(たとえば、単純な「SELECT TRIM(...)」コマンドを比較してみてください。

また、どのDBとバージョンを使用していますか?

于 2009-12-29T18:26:00.110 に答える