繁体   English   中英

Perl脚本还是MySQL修复?

[英]Perl script or MySQL fix?

我是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声明中要修复的内容?

您应该使用占位符而不是尝试插入变量并尝试进行自己的引用。 您甚至可以考虑使用'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]);

在WHERE子句中添加AND -part以过滤不需要的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

为了避免掩盖'这么多次,你可以使用qq

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

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

Record_ID LIKE \\'1%\\' || Record_ID LIKE \\'2%\\' || Record_ID LIKE \\'9%\\'替换它 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;
   }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM