2012-03-18 72 views
3

我是一名Perl初學者,剛剛通過perl scipt獲得了一項調整任務。那我現在專注的說法是:Perl腳本或MySQL修復?

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

由於「限制1」,它將拉出第一條匹配記錄。 – 2012-03-18 16:51:22

+0

您應該使用佔位符而不是嘗試自己插入和引用變量。請參閱DBI文檔。 – TLP 2012-03-18 18:09:27

回答

1

在您的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 
1

爲了避免掩蓋'這麼多次,你可以使用qq

my $sth = $dbh->prepare(qq§SELECT StringValue FROM CustomData 
          WHERE (Record_ID = '$ref->{Record_ID}' AND 
            Field_ID = '$metadata[11]') LIMIT 1§ 
         ) ; 
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]); 
+0

@ TLP-你正在使用'$ dbh-> execute',它需要是'$ sth-> execute'。此外,您的解決方案給我錯誤的單引號'數字發現運營商預計在record.pl在線。即使我避開引號,我也會得到空白輸出。 – 2012-03-19 14:35:36

+0

@Devendra你是對的。現在修復。 – TLP 2012-03-19 14:38:04

+0

@ TLP-它現在有效。 – 2012-03-19 14:43:52

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; 
    }