有多个if条件时如何进行SQL查询

有多个if条件时如何进行SQL查询,sql,node.js,postgresql,Sql,Node.js,Postgresql,我正在尝试构建一个支持列表、搜索和过滤器的API。我不知道把where子句放在哪里 它在某些情况下有效,但在许多情况下无效。例如,当输入主体具有搜索字段时,它将工作,但当您仅应用第二个过滤器时,即pan,在本例中,它没有工作 const query = { text: ` select master.contact.id, master.contact.name from master.contact ` }; if

我正在尝试构建一个支持列表、搜索和过滤器的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}`;
    }

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

Where 1=1
在您的主查询中。因此,您可以为每个条件添加和条件

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}%')`;
}

诸如此类……

您可以尝试查找现有的ORM,而不是自己有条件地构建sql语句。典型的模式是,您可以根据自己的条件构建一个“数据结构”,然后这种库的工作就是将该“数据结构”转换为发送到服务器的实际SQL语句。简而言之,人们已经发明了一些东西来做这件事,所以自己再发明一次也没有什么意义;NeilLunn:这是一个老项目,在这个阶段引入ORM需要花费大量的精力和时间。我别无选择,我必须以这种方式完成它