2011-12-23 34 views
1

我有一个工作解决方案,但我想知道是否有更好的方法来获得相同的结果。按给定参数过滤查询或空白如果没有提供

场景:

用户界面解析为一个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 ,EXYZ-4567的理论问题,其中两个ID中较短的一个将为customer_id返回项目。那么有没有一种“正确”的方式来说“返回所有结果where field ='X',但是如果'X'是空白,返回所有内容而不是什么?

+0

只知道:有任何理由,你为什么不带编程语言做到这一点? – 2011-12-23 20:18:20

+0

做哪部分?用条件语句写出子句?因为我更愿意尽可能减少代码,数据库或编程。基本上,我使用YEAR()这样的MySQL函数,而不是派生出代码中的年份并将其传入,原因与此相同。因为数据库可以这样做,并且因为我知道是否出现问题,所以使用的是查询,而不是使用php和mysql不相处。 – Anthony 2011-12-24 03:07:39

回答

2
where items.customer_id = '$customer_id' or '$customer_id' = '' 

这样的逻辑也适用于多个可选条件过滤。

编辑 - 类似的方式

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

很好。空白等于空白。让我试试看。 – Anthony 2011-12-24 03:15:06

+0

完美。这非常简单,但是我需要创造性的解决方案。谢谢。 – Anthony 2011-12-24 03:18:42

+0

哈哈,不错:) – 2011-12-24 08:54:41

1

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

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

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

+0

+1对于抛出一个未经检验的想法,工作。因为他不需要使用函数(因此应该更可靠),所以我会用克里斯的答案,但是你的想法是可靠的,我很惊讶它甚至没有跨过我的想法。谢谢。 – Anthony 2011-12-24 03:21:07

相关问题