需要编辑具有多列的SQL搜索查询

需要编辑具有多列的SQL搜索查询,sql,hql,multiple-columns,wavemaker,Sql,Hql,Multiple Columns,Wavemaker,我有一个搜索查询,包括一个表和两列 Select * from Gecoserv _a where _a.typeOfEcosystem IN (:typeNameList) AND _a.service IN (:serviceNameList) 它起作用了,但没有达到我想要的效果 比如说: typeNameList = { Freshwater, Saltwater, Dunes } serviceNameList = {Habitat, Food, Recreation }

我有一个搜索查询,包括一个表和两列

Select * 
from Gecoserv _a 
where _a.typeOfEcosystem IN (:typeNameList) 
    AND _a.service IN (:serviceNameList)
它起作用了,但没有达到我想要的效果

比如说:

typeNameList = { Freshwater, Saltwater, Dunes }
serviceNameList = {Habitat, Food, Recreation }
我希望网格只显示淡水栖息地、咸水食物和沙丘休闲等单一组合,但它也显示其他组合,例如:淡水休闲

换句话说:查询结果显示

[0,0],[0,1],[0,2],
[1,0],[1,1],[1,2],
[2,0],[2,1],[2,2].
但我只想看:[0,0],[1,1],[2,2]

我知道我必须在查询的末尾添加一些内容。我尝试了很多方法,但都没有找到一个完美的解决方案

有人能帮我吗

问候,


Melih

我认为这是不可能的,因为这是你掌握的唯一信息。参数值之间的关系是它们在列表中的位置。在SQL中没有关联和/或保留这些位置的选项

您对创建sql语句有什么影响

如果可以在代码中迭代列表并动态创建sql,则可以得到如下解决方案:

SELECT * FROM Gecoserv 
  WHERE typeOfEcosystem = 'Freshwater' AND service = 'Habitat'
UNION
SELECT * FROM Gecoserv 
  WHERE typeOfEcosystem = 'Freshwater' AND service = 'Food'
UNION
...
有关如何将其参数化的示例,请参见

另一种选择:拆分字符串

您的主要问题是保留参数在其列表中的排名/位置。这可以通过用字符串替换列表并将其分解来实现

我用过这个

使用then生成的查询如下所示:

DECLARE 
  @ecoSystems varchar(100) = 'Freshwater,Saltwater,Dunes',
  @services varchar(100) = 'Habitat,Food,Recreation',
  @separator char(1) = ','

SELECT
  [g].[id],
  [g].[typeOfEcoSystem],
  [g].[service]
FROM [dbo].[Split](@separator, @ecoSystems) [e]
INNER JOIN [dbo].[Split](@separator, @services) [s] 
  ON [e].[position] = [s].[position]
INNER JOIN [Gecoserv] [g] 
  ON [e].[part] = [g].[typeOfEcoSystem]
    AND [s].[part] = [g].[service]
ORDER BY [id] ASC
这对您的场景有效吗?回答:是的,几乎

最后没有函数


如果没有任何支持模式,甚至没有数据库制造商,我的回答将不得不对您的设置进行一些假设

理论

这听起来很像笛卡尔积。你的问题的关键是你的IN子句都是相互独立的。因此,单个记录可以同时满足这两个条件,但不是您希望在结果集中看到的结果。例如,我们有如下记录:

id   name          typeOfEcosystem  service
--   ------------  ---------------  ----------
 1   myEcoService  Freshwater       Recreation
Select * 
  from Gecoserv _a 
 where _a.typeOfEcosystem || '-' || _a.service IN ('Freshwater-Habitat', 'Saltwater-Food', 'Dunes-Recreation')
现在编写的查询将首先采用生态淡水的类型,并检查它是否在您的列表中。结果:正确

然后,查询将获取服务并检查它是否在第二个列表中。同样,找到了该值。结果:正确

所有条件的计算结果均为true,因此该行包含在最终结果集中

解决方案

在我看来,您似乎希望在子句中包含多列。请注意,这与您的尝试不同,因为最终的解决方案应该只涉及一个IN关键字。现在,查询的确切形式将在很大程度上取决于您的数据库及其提供的内容。在任何符合SQL的数据库上都应该使用的解决方案是使用字符串操作。一个粗略的例子如下:

id   name          typeOfEcosystem  service
--   ------------  ---------------  ----------
 1   myEcoService  Freshwater       Recreation
Select * 
  from Gecoserv _a 
 where _a.typeOfEcosystem || '-' || _a.service IN ('Freshwater-Habitat', 'Saltwater-Food', 'Dunes-Recreation')
在本例中,“| |”假定为串联。这是非常便携的,但速度很慢。这个问题可以更优雅地解决,但确切的解决方案将更多地取决于您的特定数据库和需求。例如,Oracle中的multiple column in子句可能非常简单:

Select * 
  from Gecoserv _a 
 where (_a.typeOfEcosystem, _a.service) IN (('Freshwater', 'Habitat'), ('Saltwater', 'Food'), ('Dunes', 'Recreation'));
您可能需要对这些解决方案中的任何一种进行推敲,以使它们与您的DBMS配合良好。更多的技巧和简单的老天爷阅读可以在以下网站找到:


您的表是否有唯一的键或其他标识列?谢谢您的回答。但是,我想做的不是逐个编写元素。您编写的第一个查询非常有效,但是应该有一种方法可以获取具有相同排名的元素。例如:typeNameList[4]和serviceList[4]或typeNameList[28]和serviceList[28],因此,我要寻找的是,查询使我们能够从数组变量中选择项;typeNameList和serviceNameList。但是诀窍是元素应该有相同的等级。谢谢你的回答。但是,我想做的不是逐个编写元素。您编写的第一个查询非常有效,但是应该有一种方法可以获取具有相同排名的元素。例如:typeNameList[4]和serviceList[4]或typeNameList[28]和serviceList[28],因此,我要寻找的是,查询使我们能够从数组变量中选择项;typeNameList和serviceNameList。但是诀窍是元素应该有相同的等级。我在我的答案中添加了一个替代选项。你能删除你的答案吗,这是一个评论?非常感谢。是的,这适用于我的场景。但我们有个问题。问题是我一直在用Wavemaker编写代码,我使用HQL而不是SQL。我想我可以通过修改HQL上的SQL查询来应用。但我不知道是否有可能在HQL上创建一个函数。我已经搜索了这个,但是找不到任何有用的信息。在这种情况下,你有什么建议吗?我不熟悉Wavemaker,也不熟悉HQL。我没有使用函数就写了这个。虽然此查询不在SQLFIDLE上运行,但在SQLServerManagementStudio中运行。希望它也能在你的环境中运行…谢谢Jacco你真的很好 我很伤心。我还没有弄明白如何在Wavemaker HQL中应用它,但我正在研究它。再次感谢你。