如何在 Tedious 中运行 sql 查询,为 sql in 运算符提供多个值?

Posted

技术标签:

【中文标题】如何在 Tedious 中运行 sql 查询,为 sql in 运算符提供多个值?【英文标题】:How to run a sql query in Tedious supplying multiple values for the sql in operator? 【发布时间】:2020-03-02 15:10:36 【问题描述】:

如果我只提供一个参数,下面的代码就可以工作。如果我从下拉列表中选择德国和墨西哥,尽管表中存在数据,但查询不会返回任何内容

前端的代码。通过 AJAX jQuery .post 发送参数

$('select').selectpicker();
var field1 = $('#field1').val();
$.post('data.js', 
    field1: field1
)

app.js 服务器端:

app.post('/data.js', function(req, res) 

    var thequery1 = `SELECT top 10 country
                        ,[ Sales] sales 
                        ,[Units Sold] as sold
                        ,FORMAT( Date, 'dd/MM/yyyy', 'en-US' ) thedate
                     FROM easternsun.dbo.financial
                     where 1 = 1`
    if (req.body.field1) 
        thequery1 = thequery1 + ' and country in (@field1)'
    
);
Promise.all([queryTablewithPararams(thequery1, req.body.field1)])
        .then(
            data => res.json(data)

        );

function queryTablewithPararams(thequery1, field1) 
    return new Promise(function(resolve, reject) 
        var con = new msSqlConnecter.msSqlConnecter(config);
        con.connect().then(function() 
            new con.Request(thequery1)
                .addParam("field1", TYPES.VarChar, field1 )
                .onComplate(function(count, datas) 
                    resolve(datas);
                ).onError(function(err) 
                    console.log(err);
                ).Run();
        ).catch(function(ex) 
            console.log(ex);
        );
    );

我的下拉列表 html 代码:

<select id="field1" class="selectpicker form-control" multiple >
    <option value="Canada">Canada</option>
    <option value="Germany">Germany</option>
    <option value="France">France</option>
    <option value="Mexico">Mexico</option>
</select>

我确信我需要在这一行中添加一些内容,但我不知道是什么。

.addParam("field1", TYPES.VarChar, field1 )

【问题讨论】:

".onComplate" 可能不是 Promise 上的有效方法? 【参考方案1】:

如果您选择多个值,req.body.field1 将是一个数组,因此我们需要稍微更改代码。我们将创建一个输入参数数组,fields,然后将其传递给我们的查询函数。 where in 子句应该可以正常工作:

我们还需要更改查询函数以接受可变数量的参数。

我认为您根本不需要更改客户端代码。

app.post('/data.js', function(req, res) 
    var thequery1 = `SELECT top 10 country
                        ,[Sales] sales 
                        ,[Units Sold] as sold
                        ,FORMAT( Date, 'dd/MM/yyyy', 'en-US' ) thedate
                    FROM easternsun.dbo.financial
                    where 1 = 1`

    // Create an array containing all input parameters
    let fields = [];
    if (req.body.field1) 
        fields = Array.isArray(req.body.field1) ? req.body.field1: [req.body.field1];
        const fieldSql = fields.map((v,index) => `@field$index`).join(",")
        thequery1 = thequery1 + ` and country in ($fieldSql)`
    

    Promise.all([queryTablewithPararams(thequery1, ...fields)])
    .then(data => res.json(data));
);

// We need to change this function to accept multiple parameters.
function queryTablewithPararams(thequery1, ...params) 
    return new Promise(function(resolve, reject) 
        var con = new msSqlConnecter.msSqlConnecter(config);
        con.connect().then(function() 
            let request = new con.Request(thequery1);
            // Add all the parameters
            for(let [index, param] of Object.entries(params)) 
                request = request.addParam(`field$index`, TYPES.VarChar, param);
            

            request.onComplate(function(count, datas) 
                    resolve(datas);
                ).onError(function(err) 
                    console.log(err);
                    reject(err);
                ).Run();
        ).catch(function(ex) 
            console.log(ex);
        );
    );

【讨论】:

必须有更好的方法来做到这一点。它非常复杂,几乎无法使用。如果我想过滤多个列并允许所有多个参数,我不确定它是否可行。 这个问题有相同的解决方案,但感觉就像一个黑客***.com/questions/32102930/… 我相信我们可以稍微简化一下代码,但你说得对,添加更多子句会使代码再次变得更复杂。【参考方案2】:

这种语法明显更简单,并且允许过滤多个列。大型表上的性能可能不会很好。

thequery1 = thequery1 + ' and country in (SELECT value FROM STRING_SPLIT(@field1,\',\')) '



.addParam("field1", TYPES.VarChar, field1)

【讨论】:

以上是关于如何在 Tedious 中运行 sql 查询,为 sql in 运算符提供多个值?的主要内容,如果未能解决你的问题,请参考以下文章

如何运行存储在 Redshift 表中的 SQL 查询

Azure Web 应用程序乏味

在 Python 中运行 SQL 查询

如何将此查询转换为 Hive SQL?

尽管阻塞会话为 0,但 SQL 查询正在阻塞另一个查询

如何将命名查询转换为 sql 查询?