2010-01-06 13 views
2

Comment trouver un% littéral avec l'opérateur LIKE?Comment trouver un% littéral avec l'opérateur LIKE avec DBD :: CSV?

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

Répondre

4

On dirait que vous ne pouvez pas faire avec la version actuelle de DBD::CSV. Vous utilisez DBD::CSV module pour accéder aux données. Il utilise le module SQL::Statement pour gérer les expressions. J'ai cherché son code source et trouvé que le code suivant gère LIKE état de l'instruction 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}); 
} 

Regardez ligne $self->{PATTERNS}->{$right} =~ s/%/.*/g;. Il convertit le modèle LIKE en expression rationnelle. Et il ne vérifie aucun symbole d'échappement. Tous les symboles % sont traduits à l'aveugle au motif .*. C'est pourquoi je pense que ce n'est pas encore implémenté.

Eh bien, peut-être que quelqu'un trouvera le temps de résoudre ce problème.