【问题标题】:SQL::Abstract - Matching Value Against Column OperationSQL::Abstract - 将值与列操作匹配
【发布时间】:2012-12-22 23:03:46
【问题描述】:

使用 SQL::Abstract,我将如何构建这个查询:

SELECT * FROM mytable WHERE col1*col2 = 4;

我一生都找不到任何例子来说明如何使操作的左侧成为自定义的东西,而不仅仅是一个列。

我能做的最好的就是让 SQL::Abstract 传递 col1*col2 并在其周围加上引号,但这会破坏乘法。

编辑:最好的解决方案是在左侧进行任何类型的运算,而不仅仅是乘法示例。例如,如果我想做一些稍微复杂一点的事情:(col1*col2)-col3.

【问题讨论】:

    标签: sql perl


    【解决方案1】:

    这能满足你的需要吗?

    use v5.16;
    use warnings;
    
    use SQL::Abstract;
    
    my $sqlab = SQL::Abstract->new;
    
    my ($stmt, @bind) = $sqlab->select('mytable', '*', { '(col1*col2)-col3' => 4 });
    
    use Data::Dump;
    dd $stmt;
    dd @bind;
    

    输出

    "SELECT * FROM mytable WHERE ( (col1*col2)-col3 = ? )"
    4
    

    【讨论】:

    • 在我的代码中,列标识符中的垃圾不起作用,但显然这是解决方案。所以我必须四处寻找,看看我出了什么问题。
    【解决方案2】:

    文档让我认为这是你的做法,但我没有尝试过:

    'col1' => { '*' => { -ident => 'col2' } }
    

    但我不确定您如何将其与 4 进行比较。

    【讨论】:

    • 不完全。这会产生“select * from mytable where col1 * col2”
    • 查看生成查询的代码会很有帮助;我不记得如何并且懒得阅读文档的那部分
    • my $qargs = { where => { col1 => 'somevalue', col2 => 'somevalue', }, };
    • err,我的意思是获取并打印出生成的 SQL 的部分
    • 哦,对不起,这只是:my ($sql, @bind) = SQL::Abstract->new('tablename',\@desiredcolumns,\%whereclause,\@sortorder); 我在我的 $qargs 中构建了所有这些 args。然后你在 $sql 中得到你的 sql 字符串,在 @bind 中得到你的值。
    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    相关资源
    最近更新 更多