Parameterize 子句可选字段 WHERE 子句

Parameterize clause optional fields WHERE clause

我有一个带有 Typescript 的 Node JS 项目,其中我在 BigQuery.

中包含数据库查询

该功能是生成一个 JSON 对象,其中包含搜索字段和值以将它们传递给查询以及 return 与这些字段匹配的所有记录。

这是对象:

let dataObj = {
  "host": "192.168,AS101",
  "code": "001,025",
  "country": "Colombia"
}

这是查询:

SELECT *
  FROM TABLE_TEST
  WHERE hostName in ('${dataObj.host}') and codeData in (${dataObj.code}) and countryName in ('${dataObj.country}')

我的问题:对象的所有字段都是可选的,如何在WHERE中添加或删除字段?

示例:

新建JSON对象:

let dataObj = {
  "host": "192.168,AS101",
  "country": "Colombia"
}

这是必须执行的查询:

SELECT *
  FROM TABLE_TEST
  WHERE hostName in ('${dataObj.host}') and countryName in ('${dataObj.country}')

升级:

JSON 对象的字段与表的字段名称不同,因此我需要更改它们的名称,这就是我目前所做的:

function formatName(key: string) {
  if (key == 'host') {
    return 'hostName'
  } else if (key == 'code') {
    return 'codeData'
  } else if (key == 'country') {
    return 'countryName'
  } else {
    return false
  }
}

let sql = " SELECT * FROM MYTABLE WHERE true ";
Object.entries(dataObj).map(
  (entri) => (sql = `${sql} AND ${formatName(entri[0])} in ("${entri[1]}")`)
);

包含在 where 子句中的每个键的数据不能为“192.168,AS101”,但必须为“192.168”,“AS101”,以便查询正确选择它。这就是我所做的,但查询没有捕捉到它:

let newData = {
  "host": dataObj.host.split(','),
  "code": dataObj.code.split(','),
  "country": dataObj.country.split(',')
}

let sql = " SELECT * FROM MYTABLE WHERE true ";
    Object.entries(dataObj).map(
      (entri) => (sql = `${sql} AND ${entri[0]} in ("${entri[1]}")`)
    );

我在这种情况下使用著名的 WHERE 1=1 技巧

const dataObj = {
    host: "192.168,AS101",
    code: "001,025",
    country: "Colombia",
  };

  let sql = " SELECT * FROM MYTABLE WHERE 1=1 ";
  Object.entries(dataObj).map(
    (entri) => (sql = `${sql} AND ${entri[0]} in (${entri[1]})`)
  );
  console.log(sql); <-- SELECT * FROM MYTABLE WHERE 1=1  AND host in (192.168,AS101) AND code in (001,025) AND country in (Colombia)

const dataObj = {
    host: "192.168,AS101",
  };

  let sql = " SELECT * FROM MYTABLE WHERE 1=1 ";
  Object.entries(dataObj).map(
    (entri) => (sql = `${sql} AND ${entri[0]} in (${entri[1]})`)
  );
  console.log(sql); <-- SELECT * FROM MYTABLE WHERE 1=1  AND host in (192.168,AS101)