2009-12-29 5 views
1

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

#!/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(); 

Имеет кому-нибудь совет?

Edit:

DBD :: SQLite: 1,25
DBD :: ExampleP: 12,010007
DBD :: Губка: 12,010002
DBD :: CSV: 0,26
DBD :: Gofer: 0,011565
DBD :: DBM: 0,03
DBD :: Proxy: 0,200 DBI: 1,609
DBD :: Файл: 0,37

SQL: Statement: 1.23

+2

У вас есть последние DBI, DBD :: CSV, SQL :: Statement? –

ответ

2

ответа:.. Аккуратных вопросов Коротких ответов от моего тестирования с SQL :: Statement-1,23 и DBD :: CSV под 5.10.0 с вашим скриптом:

  • REGEX(), кажется, работает, но возвращает номер, а не булево, который должен быть обработан немного специально:

    Fix: 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, но мы можем помочь получить его там!

+0

Теперь пришло время для моего выхода: я не являюсь носителем английского языка. Так может кто-нибудь объяснить мне предложение «Пожалуйста, напишите об ошибках с тестовыми примерами для этого модуля». Другими словами? –

+0

@sid_com, спасибо за вопрос. 'http: // rt.cpan.org' отслеживает отчеты о дефектах для каждого модуля perl, опубликованного в CPAN, и будет подходящим местом для документирования поведения ошибок TRIM(). В тестовых случаях я имею в виду показать авторам SQL :: Statement, как воспроизводить эти ошибки: ваш код, то, что вы ожидали от него, и что он делает вместо этого. – pilcrow

1

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

Кроме того, что DB и версия, которую вы используете?

+0

Нет БД. Он использует DBD :: CSV с временными таблицами, что означает, что все хранится SQL :: Statement :: RAM. – hobbs

1

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