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