0

我编写了一个非常简单的 Perl 脚本,其中包含以下行。

my $q_it = $dbh->prepare('SELECT customdata.Field_ID,
  customdata.Record_ID,
  customdata.StringValue
  FROM customdata
  WHERE customdata.Field_ID='\'10012'\' && (StringValue LIKE '\'1%'\' OR StringValue LIKE   '\'2%'\' OR StringValue LIKE '\'9%'\');
  ');

其中 customdata 是一个表。

但是,我总是遇到语法错误,抱怨“WHERER”子句:

Backslash found where operator expected at /home/wblocaladmin/Robert_2.pl line 18, near "'10012'\"

由于它是引用语句中的引用,所以我尝试像上面那样转义单引号。有没有人能帮我找出哪里出错了?

谢谢!

4

4 回答 4

5

为什么不只使用双引号将字符串括起来?

my $q_it = $dbh->prepare("SELECT customdata.Field_ID,
  customdata.Record_ID,
  customdata.StringValue
  FROM customdata
  WHERE customdata.Field_ID='10012' && (StringValue LIKE '1%' OR StringValue LIKE   '2%' OR StringValue LIKE '9%');
  ");
于 2012-05-08T19:58:07.653 回答
4

使用q引用带有单引号的字符串:

my $q_it = $dbh->prepare(q{SELECT customdata.Field_ID,
   customdata.Record_ID,
   customdata.StringValue
   FROM customdata
   WHERE customdata.Field_ID='10012' 
   && (StringValue LIKE '1%' OR StringValue LIKE   '2%' OR StringValue LIKE '9%')
});

您还可以使用 heredocs:

my $q = <<'QUERY';
    SELECT customdata.Field_ID,
    customdata.Record_ID,
    customdata.StringValue
    FROM customdata
    WHERE customdata.Field_ID='10012' 
    && (StringValue LIKE '1%' OR StringValue LIKE   '2%' OR StringValue LIKE '9%')
QUERY
my $q_it = $dbh->prepare( $q );

注意:我删除了分号,因为它不属于 DBI 查询。

作为记录,在 perl 中连接的正确方法是:

my $string = 'foo' . 'bar'; ## foobar

在 perl 中进行分隔的正确方法是:

my $string = 'foo \'bar\''; ## foo 'bar'
于 2012-05-08T20:02:37.063 回答
3

作为aleroot's answer的替代方案,您可以修复您的报价转义。您的转义引号周围有不必要的单引号。

my $q_it = $dbh->prepare('SELECT customdata.Field_ID,
  customdata.Record_ID,
  customdata.StringValue
  FROM customdata
  WHERE customdata.Field_ID=\'10012\' && (StringValue LIKE \'1%\' OR StringValue LIKE   \'2%\' OR StringValue LIKE \'9%\');
  ');
于 2012-05-08T20:00:29.480 回答
0

您可以使用双引号来减轻痛苦,但这里的问题是您只是在不使用.(dot) 运算符的情况下连接字符串。

于 2012-05-08T19:59:39.420 回答