[英]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.