我有一个有效的解决方案,但我想知道是否有更好的方法来获得相同的结果。
情景:
用户界面有一个解析为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-456
,EXYZ-4567
的理论问题,其中两个id中较短的一个会返回customer_ids的项目。
那么是否有一种“正确”的方式来说“返回所有结果,其中field ='X',但如果'X'为空,则返回所有内容而不是什么?”
答案 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");
不知道这是否有效,但我很好奇。