按给定参数筛选查询,如果没有提供,则为空

时间:2011-12-23 20:14:23

标签: mysql query-optimization

我有一个有效的解决方案,但我想知道是否有更好的方法来获得相同的结果。

情景:

用户界面有一个解析为GUID的搜索过滤器。因此,如果他们想要搜索与客户John Doe相关联的所有记录,他们将输入John Doe,在执行最终查询之前,John Doe将解析为John Doe的customer_id。因此,如果customer_id为XYZ-456,则查询为:

SELECT id AS item_id FROM items WHERE items.customer_id = 'XYZ-456';

这将返回项目ID,然后通过另一个流程向用户提供完整的搜索结果。

但显然用户可能根本不会选择过滤器。我没有插入整个WHERE参数,而是采用了以下解决方案:

SELECT id AS item_id FROM items WHERE items.customer_id LIKE '%$customer_id%';

因此,如果没有给出任何内容,它将解析为:

SELECT id AS item_id FROM items WHERE items.customer_id LIKE '%%';

将返回所有项目(所需结果)。

真的,这很好用,但从技术上讲,它们始终是以下customer_ids XYZ-456EXYZ-4567的理论问题,其中两个id中较短的一个会返回customer_ids的项目。

那么是否有一种“正确”的方式来说“返回所有结果,其中field ='X',但如果'X'为空,则返回所有内容而不是什么?”

2 个答案:

答案 0 :(得分:2)

where items.customer_id = '$customer_id' or '$customer_id' = ''
在过滤多个可选标准时,

这样的逻辑也很有效。

编辑 - 类似的方式

where '$customer_id' in (items.customer_id, '')

答案 1 :(得分:1)

只是为了理论上的乐趣,因为我肯定会在PHP中解决这个问题。

SELECT id AS item_id FROM items WHERE items.customer_id LIKE IF("$customer_id" = "", "%%", "$customer_id");

不知道这是否有效,但我很好奇。