如何删除格式化的mysql查询中的反引号?

时间:2019-11-01 18:47:11

标签: mysql node.js npm xlsx

好的,所以我已经使用npm包'xlsx'在excel中提取了一些值,我想使用格式化结果运行MySql查询。

Excel提取

    let wb= xlsx.readFile(filePath);         //GET WORKBOOK
    let ws= wb.Sheets[wb.SheetNames[0]];     //SELECT THE FIRST SHEET IN THE ARRAY
    let data= xlsx.utils.sheet_to_json(ws);  //CONVERT DATA TO JSON OBJECT
    let s ='';                               //CREATE VARIABLE TO HOLD FORMATTED STRING
    for(let i=0; i<data.length; i++){
        s+= "'" + data[i].id +"',";       //FORMAT OBJECT TO STRING
    }
    let fullString= s.substr(0, s.length-1); //STORE FORMATED STRING IN VARIABLE REMOVING FINAL COMMA (,)

格式化的字符串如下:

'2019-0027178','2019-0027179','2019-0027180','2019-0027181','2019-0027182','2019-0027183'

MySql查询如下:

SELECT name, email, phone FROM persons WHERE id IN (?),
[fullString]

期望值:

包含所需信息的json对象,如下所示:

[{name: "John", email: "john.doe@email.com", phone: "123456789"}, ... ]

实际结果:

一个空数组,如下所示:

[]

调查和思想

我发现反引号被添加到查询字符串中,如下所示:

... WHERE id IN (`'2019-0027178','2019-0027179','2019-0027180','2019-0027181','2019-0027182','2019-0027183'`)

实际的实际主要问题:

是我做错了什么,还是有正确的方法做到这一点?

编辑!

因此,对于单个问号,即。 ... WHERE id in (?),我得到了如上所述的空对象。但是对于两个问号即。 ... WHERE id IN (??),我收到此错误:

{
    "code": "ER_BAD_FIELD_ERROR",
    "errno": 1054,
    "sqlMessage": "Unknown column ''2019-0027178','2019-0027179','2019-0027180','2019-0027181','2019-0027182','2019-0027183' in 'where clause'",
    "sqlState": "42S22",
    "index": 0,
    "sql": "SELECT name, email, phone FROM persons WHERE id IN (`'2019-0027178','2019-0027179','2019-0027180','2019-0027181','2019-0027182','2019-0027183'`)"
}

2 个答案:

答案 0 :(得分:0)

假设您有一个名为personfilter的表,其中包含key和personid列。 然后,您将生成一个唯一密钥。例如27。然后,下面的操作将满足您的要求:

INSERT INTO personfilter(key,personid)
  values
     (27, '2019-0027178'),
     (27, '2019-0027179'),
     (27, '2019-0027180'),
     (27, '2019-0027181'),
     (27, '2019-0027182'),
     (27, '2019-0027183')

然后您可以执行以下选择

SELECT name, email, phone 
FROM persons
JOIN personfilter on personfilter.key = 27 and personfilter.personid = persons.id

答案 1 :(得分:0)

好的,所以我想我可以在执行查询之前“准备”查询。

〜解决方案〜

我没有这样做let fullString= s.substr(0, s.length-1);,而是将fullString作为参数传递给查询字符串,而是这样做了:

let fullString= `SELECT name, email, phone FROM persons WHERE id IN (${s.substr(0, s.length-1)})`;

然后通过fullString代替实际查询的位置。

谢谢。