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