Как мне найти буквальный% с LIKE-оператором с DBD :: CSV? - PullRequest
2 голосов
/ 06 января 2010

Как найти буквальный% с помощью LIKE-оператора?

#!/usr/bin/perl
use warnings;
use strict;

use DBI;

my $table = 'formula';
my $dbh = DBI->connect ( "DBI:CSV:", undef, undef, { RaiseError => 1 } );

my $AoA = [ [ qw( id formula ) ], 
        [ 1, 'a + b' ], 
        [ 2, 'c - d' ], 
        [ 3, 'e * f' ], 
        [ 4, 'g / h' ], 
        [ 5, 'i % j' ],     ];

$dbh->do( qq{ CREATE TEMP TABLE $table AS IMPORT ( ? ) }, {}, $AoA ); 

my $sth = $dbh->prepare ( qq{ SELECT * FROM $table WHERE formula LIKE '%[%]%' } );
$sth->execute;
$sth->dump_results;

# Output:
# 3, 'e * f'
# 1 rows

1 Ответ

4 голосов
/ 06 января 2010

Похоже, вы не можете сделать это с текущей версией DBD::CSV.

Вы используете DBD::CSV модуль для доступа к данным. Он использует SQL::Statement модуль для обработки выражений. Я искал его исходный код и обнаружил, что следующий код обрабатывает условие LIKE sql:

## from SQL::Statement::Operation::Regexp::right method
unless ( defined( $self->{PATTERNS}->{$right} ) )
{
    $self->{PATTERNS}->{$right} = $right;
    ## looks like it doen't check any escape symbols
    $self->{PATTERNS}->{$right} =~ s/%/.*/g; 
    $self->{PATTERNS}->{$right} = $self->regexp( $self->{PATTERNS}->{$right} );
}

Посмотрите на $self->{PATTERNS}->{$right} =~ s/%/.*/g; строку. Он преобразует шаблон LIKE в регулярное выражение. И это не делает никакой проверки любых escape-символов. Все символы % переводятся вслепую в шаблон .*. Вот почему я думаю, что он еще не реализован.

Ну, может быть, кто-нибудь найдет время, чтобы решить эту проблему.

...