【问题标题】:Getting the max row character length in a query using Perl DBI Mysql使用 Perl DBI Mysql 在查询中获取最大行字符长度
【发布时间】:2012-09-22 15:24:46
【问题描述】:

使用:Perl v5.10.1、MySQL 5.5.15、DBI。

我需要通过电子邮件从数据库中传送最终用户的输出。他们不希望这是一种依恋,而是在身体中。

我想在 ascii 表中提供数据,但在确定 DBI 是否具有执行此操作的内置函数时遇到问题(输出类似于从命令行查询 MySQL)。

或者,如果我可以确定最长的行字符长度,我可以使用它来构建表格。我有一种方法可以获取数组中的最大项目长度,但我无法用查询结果来解决这个问题。

my $spacer_length = (reverse sort { $a <=> $b } map { length($_) } @array)[0];

【问题讨论】:

  • “查询结果”是什么样的?
  • @ikegami 查询是可变的,但基本上我会返回大约 6 列的信息,其中包含多行数据。最长的字段是 varchar(255) 尽管我想说它们大多少于 50 个字符。我不能在这里发布查询和结果,因为敏感信息太多(而且很难掩盖)。
  • 我们不需要知道确切的数据。我们需要知道数据的结构。
  • reverse 排序?真的吗?那应该是sort { $b &lt;=&gt; $a }
  • 你能简单地避免这个问题和use Text::Table吗?

标签: mysql perl dbi


【解决方案1】:

假设一个通用的 DBI 循环,你可以这样做:

use List::Util qw(max);

...
my @output;
my $max;
while (my @foo = $dbi->fetchrow_array) {
    $max = max($max // (), map length, @foo);
    push @output, \@foo;           # save data for email attachment
}

使用“定义或”运算符// 来避免undef 警告和在负值情况下可能造成的污染。

【讨论】:

  • 这正是我想要的。谢谢!
【解决方案2】:

我不确定您确切要求的是什么,但如果您正在寻找查询结果的给定列的“最大行字符长度”,您可以使用 SQL 来做到这一点:

SELECT MAX(CHAR_LENGTH(col1)) FROM t1

或者如果您希望所有行按 col1 值的长度排序:

SELECT col1,col2 from t1 ORDER BY CHAR_LENGTH(col1) DESC

您可以像这样使用 DBI 执行这些查询:

# $mysql is your DBI connection info
my $query = $mysql->prepare("SELECT col1,col2 from t1 ORDER BY CHAR_LENGTH(col1) DESC");
$query->execute();

然后遍历结果行:

while ( my @result = $query->fetchrow_array ) {

    my ($col1,$col2) = @result;
    # do stuff with the values

}

您可以根据需要打印值,包括命令行 mysql 客户端的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-06
    • 2015-07-29
    • 2013-12-24
    • 2018-11-11
    • 2016-06-18
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    相关资源
    最近更新 更多