如何使用nodejs在IBM Db2的LIKE查询中传递参数?

Posted

技术标签:

【中文标题】如何使用nodejs在IBM Db2的LIKE查询中传递参数?【英文标题】:How to pass parameter in LIKE query of IBM Db2 with nodejs? 【发布时间】:2021-01-29 08:03:27 【问题描述】:

我正在尝试使用 node.js 12 执行从 ibm db2 到 ibm watson 助手的查询。下面您可以看到我正在使用的代码,它适用于函数 fetchHSCode(),其中从数据库中检索到的值是整数。但是对于 fetchName() 它不起作用,因为值是 varchar 格式。 得到的错误是

SyntaxError: Unexpected token '?'\n

我在编写查询时遇到问题

'SELECT DISTINCT "Commodity", "Commodity_Code" FROM "PKD20375"."TRADES" WHERE "Commodity" LIKE '%?%'; '

请注意,运行查询需要表列和表名之间的双引号 ("")。不使用双引号就不行。

var ibmdb = require('ibm_db');

// Retrieve HS code information
function fetchHSCode(dsn, hscode) 
    try 
        var conn = ibmdb.openSync(dsn);
        var data = conn.querySync('SELECT DISTINCT "Commodity_Code", "Commodity" FROM "PKD20375"."TRADES" WHERE "Commodity_Code"=?;', [hscode]);
        conn.closeSync();

    var resString = "";
    for(let i = 0; i < data.length; i++) 
        resString += data[i]['Commodity'] + "\n";
    

    // Return both generated string and data
    return 
        result: resString, data: data, input: hscode
    ;
 catch (e) 
    return 
        dberror: e
    



// Retrieve product from name
function fetchName(dsn, productName) 
    try 
         var conn = ibmdb.openSync(dsn);
         var data = conn.querySync('SELECT DISTINCT "Commodity", "Commodity_Code" FROM "PKD20375"."TRADES" WHERE "Commodity" LIKE '%?%'; ', [productName]);
         conn.closeSync();
         var resString = "";
         for(let i = 0; i < data.length; i++) 
             resString += data[i]['Commodity'] + "\n";
         
     
     
     // Return both generated string and data
     return 
         result: resString, data: data, input: productName
     ;
 catch (e) 
    return 
        dberror: e
    


【问题讨论】:

你的意思是你需要转义单引号? '\'%?%\'' ? 【参考方案1】:

您需要转义单引号,因为您的字符串中有单引号,因此必须将其转义\',如下所示

 var data = conn.querySync('SELECT DISTINCT "Commodity", "Commodity_Code" FROM "PKD20375"."TRADES" WHERE "Commodity" LIKE \'%\' || cast(? as varchar(150)) || \'%\'; ');

javascript 中,例如,如果您尝试在单引号字符串的中间使用撇号来分配字符串,例如

const brokenString = 'I'm a broken string';

将获得Uncaught SyntaxError: Unexpected identifie

所以你可以通过使用双引号字符串来解决它

const nonbrokenString = "I'm a broken string";

或使用反斜杠转义单引号

const nonbrokenString = 'I\'m a broken string';

【讨论】:

? 符号在您的示例中不表示参数标记。它在字符串常量内。它应该看起来像 LIKE \'%\' || cast(? as varchar(100)) || \'%\'

以上是关于如何使用nodejs在IBM Db2的LIKE查询中传递参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 OpenQuery 在 SQL Server 中创建别名 (IBM DB2)

DB2 v7r1(7.1?)中的 REGEXP_LIKE

如何在 IBM DB2 中的导出结果中也包含列标题

如何通过SQL从IBM db2中的查询中获取列名

无法在 IBM db2 上运行查询

如何在 IBM Data Studio 中查看 DB2 存储过程的解释计划?