如何使用LIKE-operator找到文字%?
#!/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
答案 0 :(得分:4)
使用当前版本的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
模式转换为regexp。并且它不会检查任何转义符号。所有%
符号都被盲目翻译为.*
模式。这就是为什么我认为它还没有实现。
好吧,可能有人会抽出时间来解决这个问题。