IN in in WHERE-子句未使用 SQL::Statement 正确解析



我使用的是此处提供的示例的略微修改版本:https://metacpan.org/pod/distribution/SQL-Statement/lib/SQL/Statement/Structure.pod

use SQL::Statement;
use Data::Dumper;
my $sql = q{
SELECT c1
, col2 as c2
, c3
FROM table1 t1, table2 t2
WHERE t1.c1 = t2.c2
and  t1.c1 in (11111, 22222, 33333)
GROUP by t1.c1
};
my $parser = SQL::Parser->new('ANSI');
$parser->{RaiseError}=1;
$parser->{PrintError}=0;
my $stmt = SQL::Statement->new($sql, $parser);
print Dumper($stmt->where_hash());

但是当我这样做时,我遇到了这个没有意义的错误,因为它是一个非常常见的结构:

Bad table or column name: '11111,22222,33333' has chars not alphanumeric or underscore! at /home/palert/perl5/perlbrew/perls/perl-5.28.1/lib/site_perl/5.28.1/SQL/Statement.pm line 90.

我错过了什么?

私下给维护者发邮件,而不是检查未解决的问题或阅读 https://metacpan.org/pod/SQL::Statement#Where-can-I-go-for-help? 小心翼翼地不会显示你自己花了多少时间解决问题。

北极熊从SQL::语句的角度给了你正确的答案。 我知道它有怪癖,但它是一个 20 年前的 Perl5 模块,因此它没有使用新的花哨抽象,例如通过 Moose 或 wtf 的类型系统。

OTOH - 您可以按照推荐和以太告诉您的方式使用占位符。而不是在执行时传递值,而不是在解析期间传递值。

底线是SQL::Statement相当有限,只能处理基本的SQL。缺乏对"in(数字列表("的支持只是其中之一。无法处理子查询对我来说是另一个大问题。

我对SQL::Statement寄予厚望,因为我正在从事的项目,我想即时将Sybase SQL转换为MySQL SQL语句。但它行不通。

我决定围绕 https://github.com/dmtolpeko/sqlines 创建一个Perl包装器。这并不完美,但它让我更接近我的目标。

这不是一个完整的Perl解决方案,但到目前为止,它似乎有效并且非常快。

感谢大家的评论/回答。

最新更新