存储过程中的SQL变量ORDER BY子句

时间:2012-07-23 19:14:19

标签: mysql sql

我有一个SQL查询,当前从PHP中的字符串粘贴在一起,我想把它变成一个存储过程。

此刻它就像是

function db_get ($mode)
{
    $order_by = '';
    if ('name'===$mode)
        $order_by = '`name` DESC';
    if ('date'===$mode)
        $order_by = '`date` DESC';
    // ...

    return db_all_rows ("SELECT foo FROM bar WHERE baz ORDER BY $order_by");
}

我不认为列的名称可以作为存储过程的参数,所以似乎我要根据需要复制粘贴每种订单的整个查询,或者做像这样的某种数字黑客

CREATE PROCEDURE GetStuff (IN use_name INT, IN use_date INT, ...)
    SELECT foo, (name*use_name + date*use_date + ...) AS order_by_value
    FROM bar WHERE baz ORDER BY order_by_value

我不确定哪个更糟。

我更喜欢数字黑客的重复,除非它会搞砸优化器。

它会搞砸优化器吗?

或者更好的是,我可以正确地对order-by子句进行参数化吗?

1 个答案:

答案 0 :(得分:2)

试试这个:

SELECT foo
FROM bar
WHERE baz
ORDER BY
    case when $order_by='name' then name else null end
,   case when $order_by='date' then date else null end

我们的想法是构建一个包含所有ORDER BY列的列表,并使用when条件保护每个列,以便只有其中一列是“有效”。