1

我正在构建一个具有大量潜在输入的复杂搜索应用程序。每个输入都是可选的。我正在尝试以模块化方式构建查询。

假设我有两个不同的查询,每个查询都有独立的WHERE条件:

SELECT * FROM t1 WHERE t1.c1 = x

SELECT * FROM t2 WHERE t2.c1 = y

我发现以下代码是有效的:

SELECT * FROM t1 INNER JOIN t2 ON t1.c2 = t2.c2 WHERE t1.c1= x AND t2.c1= y

但是,由于最后将WHERE条件组合在一起,因此很难以模块化方式实现这一点。所以,我尝试了这个:

SELECT * FROM t1 WHERE t1.c1 = x INNER JOIN ON t1.c2 = t2.c2 WHERE t2.c1 = y

但是,此代码无效。WHERE用独立子句连接任意数量的表的最佳方法是什么?

4

2 回答 2

0

在这种情况下,我在代码中动态构建 WHERE 子句。我不确定是否有更好的方法。

请务必使用准备好的语句(参数化查询)。构建没有参数的 WHERE 子句是一个巨大的安全问题

于 2012-07-10T00:02:10.840 回答
0

表之间的连接可能能够有条件地实现 - 并且where在末尾连接子句 - 如下所示:

SELECT * 
FROM t1 
  INNER JOIN t2 ON t1.c2 = t2.c2 
  INNER JOIN t3 ON t1.c3 = t3.c3  
  INNER JOIN t4 ON t1.c4 = t4.c4  
WHERE t1.c1 = x 
  AND t2.c2 = y
  AND t3.c3 = z
  AND t4.c4 = a

您可以根据用户选择的选项有条件地将其构建为字符串。

虽然动态构建where子句和joins一起可能有效,但可能存在一些需要注意的陷阱。

首先,连接仍然可能必须根据表连接在一起的自然方式定制构建——例如,t3可能只能连接到t2而不是t1where这些条款也会有类似的问题。每个 where 子句都必须根据表中的列自定义构建。

换句话说,这个问题不太可能完全概括。最后,您需要根据表的具体情况编写自定义 SQL。更糟糕的是,随着时间的推移,表会改变,SQL 也必须随之改变。如果您正在动态构建复杂的 SQL,您可能会遇到维护难题。

此外,随着应用程序的增长,您可能希望针对每种组合调整 SQL 以优化查询。确保在构建时尝试考虑到这一点。

于 2012-07-10T00:23:05.893 回答