Perl скрипт или MySQL исправить? - PullRequest
3 голосов
/ 18 марта 2012

Я новичок в 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 ]

2 голосов
/ 18 марта 2012

Вы должны использовать заполнители вместо того, чтобы пытаться интерполировать ваши переменные и пытаться сделать свое собственное цитирование.Вы можете даже рассмотреть возможность использования заполнителей для '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 голос
/ 19 марта 2012

Вы правы относительно изменения детали 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;
   }
1 голос
/ 18 марта 2012

Чтобы не маскировать ' столько раз, сколько вы можете использовать qq

my $sth = $dbh->prepare( qq§SELECT StringValue FROM CustomData 
                            WHERE (Record_ID = '$ref->{Record_ID}' AND 
                                   Field_ID = '$metadata[11]') LIMIT 1§
                       ) ;
1 голос
/ 18 марта 2012

Добавьте AND -часть в предложении WHERE для фильтрации нежелательных идентификаторов 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...