我有一个字符串数组。当我使用.toString()输出它时,引号不会被保留。这使得使用“in”构建mysql查询变得很困难。请考虑以下事项:
SELECT * FROM Table WHERE column IN ('item1','item2','item3','item4')
toString is returning: IN (item1,item2,item3,item4)
我必须在这里找到一个简单的解决方法。
答案 0 :(得分:63)
引号不会被保留,因为它们实际上并不是字符串值的一部分,它们只是在代码中指示字符串文字所必需的。
所以,不要使用toString()
。相反,一种方法如下:
var arr = ['item1','item2','item3','item4'];
var quotedAndCommaSeparated = "'" + arr.join("','") + "'";
// quotedAndCommaSeparated === "'item1','item2','item3','item4'"
Array.join()方法返回一个字符串,该字符串是连接成单个字符串的所有数组元素,每个项目之间有一个(可选)分隔符。因此,如果您指定包含引号和逗号的分隔符,则只需手动为第一个和最后一个项目(分别)附加起始和结束报价。
(请告诉我你没有使用客户端JavaScript来构建你的SQL。)
编辑:要允许空数组,请为结果字符串包含默认值,否则(由missingno指出)字符串将为"''"
:
var newString = arr.length === 0 ? "" : "'" + arr.join("','") + "'";
// default for empty array here ---^^
(可能更适合让if (arr.length===0)
采取其他行动而不是运行SELECT语句。)
答案 1 :(得分:5)
简单的解决方法是自己添加引号
for(var i=0; i<items.length; i++){
items[i] = "'" + items[i] + "'";
}
var list_with_quotes = items.join(",");
请注意,我完全忽略了SQL注入问题。
答案 2 :(得分:1)
使用Array.map
用引号包装每个元素:
items.map(function(item) { return "'" + item + "'" }).join(',');
使用ES6功能使代码变得更简单 - 箭头函数和模板字符串(在node.js 4.0及更高版本中实现):
items.map(i => `'${i}'`).join(',');
您也可以使用白名单来阻止SQL注入:
const validItems = new Set(['item1', 'item2', 'item3', 'item4']);
items
.filter(i => validItems.has(i))
.map(i => `'${i}'`)
.join(',')
答案 3 :(得分:0)
let keys = ['key1','key2']
let keyWithQoutes = keys.map((it) => {return `'${it}'`})
let sql = `SELECT .... FROM ... WHERE id IN (${keyWithQoutes})`
console.log(sql)
输出:“ SELECT .... FROM ... WHERE ID IN('key1','key2')”
答案 4 :(得分:-2)
存储引号:
var names = ["'item1'","'item1'","'item3'"];
alert('IN (' + names[1] + ')'); // IN ('item1')