java在where in子句中没有值时如何执行查询
我有一个根据不同id获取结果的查询, 我的查询如下所示: 我已经缩短了查询,但是,还有两个WHERE In条件
SELECT DISTINCT restaurant.*,branch.*
from restaurant,branch,restaurant_cuisines,restaurant_collections
WHERE restaurant.restaurant_id=branch.restaurant_id
AND restaurant_cuisines.cuisine_id IN (2,3)
AND restaurant_collections.collection_id IN ();
当第二个WHERE in条件中没有值时,如何执行此查询? 或者如何在应用程序级(Java)中处理这个问题,我需要编写大约28个if-else条件来检查空条件。如何克服这个问题
# 1 楼答案
这是一个应用程序任务,不是SQL任务
当我有一个带有几个可选输入的API时,我会动态地构造
WHERE
。比如(抱歉,这是用PHP编写的,不是用Java编写的):注:
x
的条目,那么WHERE
的那部分将被省略李>WHERE
子句李>IN
有点混乱,但仍然不错李># 2 楼答案
我通常通过增加布尔变量来解决这种情况。 在您的示例中,我有一个额外的布尔参数,名为SearchByCollectionId,因此它类似于:
当:collectionIds为空时,您将在其中输入-1,:searchByCollectionIds设置为false,您的查询将被转换为:
由于支架中的第一个条件不满足,因此不会检查第二个条件。所以你会得到一切
# 3 楼答案
如果不将“餐厅美食”和“餐厅收藏”与其他项目联系起来,SQL就没有真正的意义。如果这两个表与其他表不相关,那么SQL就是这些表的笛卡尔积
例如,我们有两列(C1和C2)的表A和表B
制作SQL
选择A&;B用空值保留“洞”
首先,将表与所需字段关联起来。然后使用适当的联接(左联接或外联接)建立关系。如果进行了更正,则与联接的第二部分不相关的行将为空(如空集合),并且可以选择其值为空的所有行(ej:restaurant_collections.collection_id为空)
示例:(需要填写缺失的关系)
# 4 楼答案
如果您只想让查询工作,那么您应该能够使用:
但这永远不会有结果
如果您想要更灵活一点的东西,或者如果
collection_id
没有任何值传递给它,您希望得到所有结果,我建议将隐式联接更改为显式联接现在您正在使用隐式连接语法:
问题是,如果
C.j
为空,即使修改了语法,查询也不会返回任何结果显式联接允许采用更细致的方法:
编码时,不要传递空字符串,而是传递空值(或者,如果没有使用准备好的语句,则传递包含
NULL
的字符串)。否则,将值作为列表传递如果只需要在没有值的情况下忽略这些行,可以这样做:
当您添加
LEFT JOIN
并在WHERE
子句中引用它时,如果通过使用COALESCE函数传递的值不是空的,则可以轻松检查C.v
是否包含值列表总之,
LEFT
连接非常灵活,允许您稍后返回并选择性地强制执行严格的INNER JOIN
。它们不应该在INNER JOIN
执行任务时使用,但它们肯定有自己的用途,比如这里关于
LEFT
与INNER
的注释:LEFT JOIN
李>INNER JOIN
李># 5 楼答案
这个问题似乎缺乏一些解释。对于其他人来说,帮助你的最佳方式是对以下方面进行深入了解:
我可能会在你的提问中补充一些一般性意见:
# 6 楼答案
这完全取决于你的需要。通常你应该跳过整个部分
当您对所有条件使用
AND
时,我假设通过空列表,您希望返回所有行。(我猜最终用户有一些多个复选框之类的东西)如果列定义为
NOT NULL
,您可以用JAVA生成如下代码:当需要特定值时,请将其用作上一个值: