字体:
这个问题我一般是这么解决的 [#4421595@0 -ROLIA.NET 相约加拿大网上社区 之 枫下论坛 & 枫下部落, 枫下论坛主坛 ]

这个问题我一般是这么解决的

by newkid (newkid) at 2008.4.28 16:40 (#4421595@0)
假设你有一个users表,用户可能按firstname, 或 lastname, 或 department_id 查询 (这是个简化模型,但复杂的情况也大同小异)

用静态SQL:
SELECT ...
FROM users
WHERE (firstname = p_firstname OR p_firstname IS NUL)
AND (lastname = p_lastname OR p_lastname IS NUL)
AND (department_id = p_department_id OR p_department_id IS NUL)
...........( 其他类似)

但是,这种静态SQL只能生成一个执行计划,可能不是最优的。

如果用ORACLE,并确信某列非空,可以这么写(这有可能会生成好的计划):
firstname = NVL(p_firstname,firstname)

如果你确信有些查询条件会利用到更好的索引,那么你必须采用动态SQL, 只把有输入的拼装到WHERE里去。当然要记得用帮定变量,不要用常量。

该话题已在历史区内,不能被修改或回复。       收藏    投诉
关闭窗口