【问题标题】:How to make SQL query when you have multiple if conditions有多个 if 条件时如何进行 SQL 查询
【发布时间】:2019-04-20 14:39:46
【问题描述】:

我正在尝试构建一个支持、列出、搜索和过滤器的 API。我不确定在哪里放置 where 子句。

它在某些情况下有效,但在很多情况下都无效。例如,当输入正文有搜索文件时,它会起作用,但是当你只应用第二个过滤器时,pan 在这种情况下它没有。

const query = {
    text: `
      select master.contact.id,
      master.contact.name
      from
      master.contact
       `
  };
  if (input.search) {
    query.text += ` where
    (master.contact.pan ILIKE '${input.search}%' or master.contact.ira ILIKE '${input.search}%')`;
  }

  if (input.filters) {
    const {
      isActive,
      pan
    } = input.filters;
    if (isActive !== undefined) {
      query.text += ` where master.contact.isActive = ${isActive}`;
    }

    if (pan) {
      query.text += `and master.contact.pan = ${pan}`;
    }

【问题讨论】:

  • 您可能会尝试寻找现有的 ORM,而不是尝试自己有条件地构建 sql 语句。典型的模式是你可以根据你的条件建立一个“数据结构”,然后这个库的工作就是将该“数据结构”转换为发送到服务器的实际 SQL 语句。简而言之,人们已经发明了一些东西来做到这一点,所以自己再次发明它没有什么意义。
  • 谷歌搜索; google.com/search?q=node+js+orm+postgres 并研究结果。
  • @NeilLunn:这是一个老项目,现阶段引入 ORM 需要花费大量的精力和时间。我别无选择我必须这样完成它

标签: sql node.js postgresql


【解决方案1】:

有不同的方法可以做到这一点。其中之一是拥有

Where 1=1

在您的主要查询中。因此,您可以为每个条件添加 And 条件。

const query = {
text: `
  select master.contact.id,
  master.contact.name
  from
  master.contact
  where 1=1
  `
}; 

If (input.search) { 
  query.text += ` and (master.contact.pan ILIKE '${input.search}%' or master.contact.ira ILIKE '${input.search}%')`;
}

等等……

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 2016-02-07
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多