首页 > 解决方案 > 如何通过 3 个过滤器过滤?

问题描述

现在我有一个功能来识别用户输入了哪个过滤器。这是我当前代码的工作方式:

背景

问题

有人可以给我指导吗?我试图尝试它(这是我注释掉的代码),但它破坏了整个功能。

这是我当前的代码:

   // retrieve data from PerformanceWithPopularity Table
    function getPopularity(festivalId, startTime, endTime, page = 0, pageSize = 5, callback) {
        let whereClause;
        let i = 1;
        const values = [];
        if (!festivalId && !startTime && !endTime) { whereClause = '' }
        // else if (!festivalId && startTime && endTime) {
        //     whereClause = 'WHERE'
        //     whereClause += `startTime >= $${i++} AND endTime < $${i++}`;
        //     values.push(parseInt(startTime));
        //     values.push(parseInt(endTime));
        // }
        else {
            whereClause = 'WHERE'
            if (festivalId) {
                whereClause += ` festivalId = $${i++}`;
                values.push(parseInt(festivalId));
            }
            if (startTime) {
                whereClause += festivalId ? ` AND startTime >= $${i++}` : ` startTime >= $${i++}`;
                values.push(parseInt(startTime));
            }
            if (endTime) {
                whereClause += festivalId ? ` AND endTime < $${i++}` : ` endTime < $${i++}`;
                values.push(parseInt(endTime));
            }
            // if (festivalId && startTime && endTime) {
            //     whereClause += `festivalId = $${i++} AND starTime >= $${i++} AND endTime < $${i++}`;
            //     values.push(parseInt(festivalId));
            //     values.push(parseInt(startTime));
            //     values.push(parseInt(endTime));
            // }
        }
        let limitoffsetClause = `LIMIT $${i++} OFFSET $${i++}`
        values.push(parseInt(pageSize));    //Limit = pageSize
        values.push(parseInt(page) * parseInt(pageSize));   //offset = page * pageSize
        const query = `SELECT * FROM PerformanceWithPopularity ${whereClause} ${limitoffsetClause}`;
        const client = connect();
        client.query(query, values, function (err, rows) {
            console.log(query)
            client.end();
            callback(err, rows);
        });
    }

标签: javascriptpostgresqlfunction

解决方案


我建议您开始过滤结果集,WHERE 1 = 1以避免代码中不必要的条件。此外,查看您的代码,您可能会在查询中的关键字之间缺少一些空格。与其使用parseInt您,不如尝试在变量前面加上+符号,它还应该为您提供变量的数字表示。最后一件事,如果您在数据库中有startTime并且endTimeDateTime数据库中,您可能需要获取参数DateTime表示而不是其数值,但我假设您已经意识到这一点并且您将它作为数据库中的 Unix 时间戳。因此,请检查以下功能是否更好:

function getPopularity(festivalId, startTime, endTime, page = 0, pageSize = 5, callback) {

    let query = 'SELECT * FROM PerformanceWithPopularity WHERE 1 = 1 ';

    let ordinal = 1;
    let parameters = [];

    if (festivalId) {
        query += ` AND festivalId = $${ordinal++} `;
        parameters.push(+festivalId);
    }

    if (startTime) {
        query += ` AND startTime >= $${ordinal++} `;
        parameters.push(+startTime);
    }

    if (endTime) {
        query += ` AND endTime <= $${ordinal++} `;
        parameters.push(+endTime);
    }

    if (pageSize) {
        query += ` LIMIT $${ordinal++} `;
        parameters.push(+pageSize);
    }

    const offset = (+page) * (+pageSize);
    if (offset) {
        query += ` OFFSET $${ordinal++} `;
        parameters.push(offset);
    }

    const client = connect();
    client.query(query, parameters, function (err, rows) {
        console.log(query);
        client.end();
        callback(err, rows);
    });
}

推荐阅读