【问题标题】:DBIx::Class : Resultset order_by based upon existence of a value in the listDBIx::Class : 基于列表中存在值的结果集 order_by
【发布时间】:2011-12-24 01:36:07
【问题描述】:

我正在使用 DBIx::Class 并且我有一个 ResultSet。我喜欢重新排序 ResultSet。我喜欢根据值的固定列表(“伦敦”、“纽约”、“东京”)检查特定列“城市”如果在值列表中找到城市,我想将该结果移至顶部组。如果未找到 city,我喜欢将该结果移动到 ResultSet 中的底部组。

【问题讨论】:

    标签: sql perl dbix-class


    【解决方案1】:

    ORDER BY expr 可能就是您要找的。​​p>

    例如,这里有一个表格:

    mysql> select * from test;
    +----+-----------+
    | id | name      |
    +----+-----------+
    |  1 | London    |
    |  2 | Paris     |
    |  3 | Tokio     |
    |  4 | Rome      |
    |  5 | Amsterdam |
    +----+-----------+
    

    这里是特殊订购:

    mysql> select * from test order by name = 'London' desc, 
                                       name = 'Paris'  desc, 
                                       name = 'Amsterdam' desc;
    +----+-----------+
    | id | name      |
    +----+-----------+
    |  1 | London    |
    |  2 | Paris     |
    |  5 | Amsterdam |
    |  3 | Tokio     |
    |  4 | Rome      |
    +----+-----------+
    

    将其转换为 ResultSet 方法:

    $schema->resultset('Test')->search(
        {},
        {order_by => {-desc => q[name in ('London', 'New York', 'Tokyo')] }}
    );
    

    【讨论】:

    • 这适用于哪个版本?它不适用于 DBIx::Class 0.08123。我也没有在 SQL::Abstract 中看到任何参考,但这可能意义不大。
    • 是否可以创建额外的动态字段并在新字段上执行 order_by?
    • daxim 添加的示例(谢谢您的编辑,顺便说一句,我的最后一句话有点含糊:)并不完全是它的本意。您可以为 order_by 参数指定对字符串的引用,因此您可以动态构建一个字符串,如“name = 'London' desc, name = 'Paris' desc, name = 'Tokyo' desc”
    • Oracle 数据库不接受由此生成的查询。 Oracle 为此使用“解码”。有办法吗?
    • 在 Oracle 中,您可以使用 ORDER BY CASE 表达式,此处解释为:searchoracle.techtarget.com/answer/…(我没有临时安装 Oracle 可尝试,抱歉)
    【解决方案2】:

    类似:

    #!/usr/bin/env perl
    use strict;
    use warnings;
    my $what = shift or die;
    my @ary  = qw(alpha beta gamma);
    unshift(@ary,$what) unless ( grep(/$what/,@ary) );
    print "@ary\n";
    1;
    

    运行方式:

    ./myscript omega
    

    【讨论】:

    • 我正在寻找 dbic 答案。
    猜你喜欢
    • 2011-07-19
    • 2014-03-30
    • 2011-06-27
    • 2012-02-15
    • 1970-01-01
    • 2011-03-26
    • 2015-04-04
    • 1970-01-01
    • 2011-07-09
    相关资源
    最近更新 更多