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)
我有一个带有 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)