【问题标题】:how to chomp the value of an array while in where condition of select query?如何在选择查询的 where 条件下 chomp 数组的值?
【发布时间】:2018-03-26 13:55:47
【问题描述】:

我无法找到如何将数组 var1 的第 5 个值前值的 剔除。

my $sql2 = 'select name, value from A.Database2 minus select name, value from A.database1';

my $sth2 = $dbh1->prepare($sql2);
$sth2->execute();

while ( my @row = $sth2->fetchrow_array ) {

    print join(',', @row), "\n\n";

    chomp;    

    push( @var1, $row[0] );
}

foreach ( @var1 ) {
    print "$_\n";
}

my $sth3 = $dbh->prepare("select name, value from A.database1 where name in (" . join(",", @var1) . ")" ) or die "Can't prepare statement: $DBI::errstr";
$sth3->execute(@var1);

while ( my @row = $sth3->fetchrow_array ) {
    print join(", ", @row), "\n";
}

DBD::Oracle::db prepare failed: ORA-00904: "APR_IMDG_MODE_ENABLED": invalid identifier (DBD ERROR: error possible near indicator at char 144 in 'select name,value from A where name in (a ,b,c,d,e)') [for Statement "select name,value from A where name in (a,b,c,d,e)"] 在 hello.pl 第 102 行。

用户代码中未捕获的异常:
无法准备语句:ORA-00904:“APR_IMDG_MODE_ENABLED”:无效标识符(DBD 错误:错误可能在'select name,value from where name in (a,b,c,d,e)') 在 hello.pl 第 102 行。

【问题讨论】:

  • 你不能使用子查询来代替两个单独的数据库调用吗?您需要value 列吗?
  • @Borodin 我需要打印A表database1的name和values列数据
  • join(",", @var1) => qw(?) x @var1

标签: sql oracle perl scripting


【解决方案1】:

如果你想从@var1中字符串的开头删除<*>,那么你可以写

S/^<\*>// for @var1

您还需要引用IN 子句的每个元素,否则这些值将被视为列名。您可以使用$dbh1-&gt;quote,但最好使用占位符,方法是构建一串问号?, ?, ?, ...,其中的占位符与@var1 中的元素一样多

这应该对您有用,但我目前无法对其进行测试。请注意,SQL 语句最好使用大写语言单词和 heredoc 以提高可读性

s/^<\*>// for @var1;  # remove any indicators

my $pholds = join ', ', ('?') x @var1;  # "?, ?, ?, ?, ?"

my $sth3 = $dbh->prepare(<<END_SQL) or die "Can't prepare statement: $DBI::errstr";
SELECT name, value FROM A.database1
WHERE name IN ($pholds)
END_SQL

$sth3->execute(@var1);

while ( my @row = $sth3->fetchrow_array ) {
    print join(", ", @row), "\n";
}

【讨论】:

    【解决方案2】:

    chomp 删除尾随空格。见perldoc -f chomp。它不可能是你想要的。 要去除前导 ,您可以使用 s/^&lt;&gt;//

    【讨论】:

    • 它不会删除尾随空格;它专门删除了$/ 中输入记录分隔符的文本,该文本通常是单个换行符,但可以设置为您喜欢的任何内容。
    • @jira 感谢您的回复。我尝试使用 s/^// 但无法将其放在带引号的位置条件的适当位置。如果可能的话,请告诉我语法。
    • OP 想要删除前导字符,不是吗?至少那是我的阅读。我尽量简短,并参考 perldoc 了解详细信息。
    • 是的,看起来是这样(但他们实际上想删除&lt;*&gt;——星星被标记吞噬了);我只是在纠正您对 chomp 所做的解释。这没什么大不了的。
    猜你喜欢
    • 2020-08-29
    • 2018-01-31
    • 2019-12-09
    • 1970-01-01
    • 2016-01-23
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多