1

我有一个 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 子句吗?

4

1 回答 1

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以便其中只有一个是“活动的”。

于 2012-07-23T19:22:31.803 回答