Работают ли SQL::Statement REGEX и TRIM с DBD::CSV?

Функции «REGEX()» и «TRIM()» в этом скрипте работают не так, как я ожидал. REGEX-функция всегда возвращает true, а TRIM-функция возвращает "trim_char", а не обрезанную строку. (Когда я пишу функцию TRIM с FROM вместо «,», я получаю сообщение об ошибке.)

#!/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


person sid_com    schedule 29.12.2009    source источник
comment
У вас есть последние версии DBI, DBD::CSV, SQL::Statement?   -  person Alexandr Ciornii    schedule 30.12.2009


Ответы (3)


Ответ: Аккуратная проблема. Краткие ответы из моего тестирования с 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, но мы можем помочь!

person pilcrow    schedule 30.12.2009
comment
Теперь пришло время моего каминг-аута: я не являюсь носителем английского языка в so. Так может ли кто-нибудь объяснить мне предложение «Пожалуйста, зарегистрируйте ошибки с тестовыми примерами для этого модуля» другими словами? - person sid_com; 30.12.2009
comment
@sid_com, спасибо за вопрос. http://rt.cpan.org отслеживает отчеты о дефектах для каждого модуля perl, размещенного на CPAN, и будет подходящим местом для документирования ошибочного поведения TRIM(). Под тестовыми примерами я имею в виду показать авторам SQL::Statement, как воспроизвести эти ошибки: ваш код, что вы ожидали от него и что он делает вместо этого. - person pilcrow; 30.12.2009

Вы должны свести свой код к минимальному примеру, необходимому для демонстрации проблемы, а затем сравнить полученные результаты с тем, что происходит, когда вы вводите эти команды в интерфейс командной строки БД. (например, попробуйте сравнить простую команду "SELECT TRIM(...)".

Кроме того, какую БД и версию вы используете?

person Ether    schedule 29.12.2009
comment
БД нет. Он использует DBD::CSV с временными таблицами, что означает, что все хранится в SQL::Statement::RAM. - person hobbs; 29.12.2009

Вы уверены, что базовый механизм SQL (я думаю, DBI::SQL::Nano) реализовал эти функции? Лучше всего выбрать данные и обработать их с помощью Perl.

person rplevy    schedule 30.12.2009