Perl脚本还是MySQL修复?

时间:2012-03-18 16:48:36

标签: mysql regex perl

我是Perl的初学者,只是使用perl scipt进行调整任务。我现在关注的声明是:

my $sth = $dbh->prepare('SELECT StringValue FROM CustomData WHERE (Record_ID = \'' . $ref->{'Record_ID'} . '\' && Field_ID = \'' . $metadata[11] . '\') LIMIT 1;');

当前语句将提取与Record_ID值匹配的每条记录。但是,需要将其更改为仅拉取记录,其中Record_ID以数字1,2,9开头

我认为这更像是正则表达式问题,这是正确的吗?如果是这种情况,我应该只修改

 Record_ID = \'' . $ref->{'Record_ID'}

一部分。那是对的吗?或者那应该是prepare声明中要修复的内容?

4 个答案:

答案 0 :(得分:2)

您应该使用placeholders而不是尝试插入变量并尝试自己引用。您甚至可以考虑使用'1%'等占位符,除非您在所有查询中都认为它们是静态的。

my $sth = $dbh->prepare( q#
     SELECT StringValue FROM CustomData 
     WHERE (Record_ID = ? && Field_ID = ?) 
     AND (Record_ID LIKE '1%' OR Record_ID LIKE '2%' OR Record_ID LIKE '9%')
     LIMIT 1
#);

$sth->execute($ref->{'Record_ID'}, $metadata[11]);

答案 1 :(得分:1)

在WHERE子句中添加AND - 部分以过滤不需要的Record_ID。

SELECT StringValue 
FROM CustomData \
WHERE (Record_ID = \'' . $ref->{'Record_ID'} . '\' && Field_ID = \'' . $metadata[11] . '\') 
AND (Record_ID  LIKE "1%" OR Record_ID  LIKE "2%" OR Record_ID  LIKE "9%")
LIMIT 1

答案 2 :(得分:1)

为避免屏蔽'这么多次,您可以使用qq

my $sth = $dbh->prepare( qq§SELECT StringValue FROM CustomData 
                            WHERE (Record_ID = '$ref->{Record_ID}' AND 
                                   Field_ID = '$metadata[11]') LIMIT 1§
                       ) ;

答案 3 :(得分:1)

你改变部分Record_ID = \'' . $ref->{'Record_ID'} . '\'

是正确的

将其替换为Record_ID LIKE \'1%\' || Record_ID LIKE \'2%\' || Record_ID LIKE \'9%\'

删除LIMIT 1,这只匹配任何一行,从1,2或9开始

以下是我认为解决方案可以实现的方式

my $sth = $dbh->prepare('
    SELECT StringValue 
    FROM CustomData 
    WHERE ( Record_ID LIKE \'1%\' || Record_ID LIKE \'2%\' || Record_ID LIKE \'9%\' 
    && Field_ID = \''. $metadata . '\');');

$sth->execute;

while (my @arr=$sth->fetchrow_array())
   {
   print @arr;
   }