我有一个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子句进行参数化吗?
答案 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
条件保护每个列,以便只有其中一列是“有效”。