Javascript 如何仅在传递的值未定义时更新表?[PostgreSQL]

Javascript 如何仅在传递的值未定义时更新表?[PostgreSQL],javascript,node.js,postgresql,Javascript,Node.js,Postgresql,我正试图使用javascript在PostgreSQL中发出一些更新请求,但在更新方法方面遇到了一些问题: 我以前是这样的: var query = client.query("UPDATE COMPANY SET company_name=$1, phone=$2 WHERE company_id = $3", [data.company_name, data.phone, company_id_requested]); 无论data.company\u name或data.phone的值是

我正试图使用javascript在PostgreSQL中发出一些更新请求,但在更新方法方面遇到了一些问题:

我以前是这样的:

var query = client.query("UPDATE COMPANY SET company_name=$1, phone=$2 WHERE company_id = $3", [data.company_name, data.phone, company_id_requested]);
无论
data.company\u name
data.phone的值是多少,这都会更新表company。问题是这些值可以是未定义的,但是如果这些值未定义,我不想将tables值更新为NULL

我已经尝试了一个新的代码来解决这个问题,但我真的没有发现它干净,特别是因为我必须为每个更新方法都这样做

    var queryText = "UPDATE COMPANY SET ";
    var params = [];
    if (data.company_name !== undefined) {
        if (params.length != 0)
            queryText += ", ";
        params.push(data.company_name);
        queryText += "company_name=$" + params.length;  
    }
    if (data.phone !== undefined) {
        if (params.length != 0)
            queryText += ", ";
        params.push(data.phone);
        queryText += "phone=$" + params.length;
    }
    params.push(company_id_requested);
    queryText += " WHERE company_id = $" + params.length;
    console.log(queryText);
    var query = client.query(queryText, params);

在这里,我基本上构造了查询。没有其他方法吗?

尝试将条件添加到where子句中:

var query = client.query("UPDATE COMPANY SET company_name=$1, phone=$2 WHERE company_id = $3 AND $1 IS NOT NULL AND $2 IS NOT NULL", [data.company_name, data.phone, company_id_requested]);

尝试将条件添加到where子句中:

var query = client.query("UPDATE COMPANY SET company_name=$1, phone=$2 WHERE company_id = $3 AND $1 IS NOT NULL AND $2 IS NOT NULL", [data.company_name, data.phone, company_id_requested]);

以下函数将根据表名和要设置属性的对象为您生成此类更新:

function createUpdate(table, data) {
    if (!table || typeof table !== 'string') {
        throw new TypeError("Parameter 'table' must be a non-empty string.");
    }
    if (!data || typeof data !== 'object') {
        throw new TypeError("Parameter 'data' must be an object.");
    }
    var keys = Object.keys(data)
        .filter(function (k) {
            return data[k] !== undefined;
        });
    var names = keys.map(function (k, index) {
        return k + ' = $' + (index + 1);
    }).join(', ');
    var values = keys.map(function (k) {
        return data[k];
    });
    return {
        query: 'UPDATE ' + table + ' SET ' + names,
        values: values
    };
}
测试:

var obj = {
    one: 1,
    two: 'two',
    last: undefined
};

var update = createUpdate("Company", obj);
这将创建以下对象:

{ query: 'UPDATE Company SET one = $1, two = $2', values: [ 1, 'two' ] }
所以你可以打电话:

client.query(update.query, update.values);

以下函数将根据表名和要设置属性的对象为您生成此类更新:

function createUpdate(table, data) {
    if (!table || typeof table !== 'string') {
        throw new TypeError("Parameter 'table' must be a non-empty string.");
    }
    if (!data || typeof data !== 'object') {
        throw new TypeError("Parameter 'data' must be an object.");
    }
    var keys = Object.keys(data)
        .filter(function (k) {
            return data[k] !== undefined;
        });
    var names = keys.map(function (k, index) {
        return k + ' = $' + (index + 1);
    }).join(', ');
    var values = keys.map(function (k) {
        return data[k];
    });
    return {
        query: 'UPDATE ' + table + ' SET ' + names,
        values: values
    };
}
测试:

var obj = {
    one: 1,
    two: 'two',
    last: undefined
};

var update = createUpdate("Company", obj);
这将创建以下对象:

{ query: 'UPDATE Company SET one = $1, two = $2', values: [ 1, 'two' ] }
所以你可以打电话:

client.query(update.query, update.values);

这将生成与查询的更新逻辑完全不同的更新逻辑。这将生成与查询的更新逻辑完全不同的更新逻辑。您不能使用
节点postgres
,因为它不允许在查询中动态使用列名,更不用说自定义类型了。但是,如果您要使用,这将是相当容易实现的。再想想,我已经为您发布了一个可能的解决方案;)不能使用
节点postgres
,因为它不允许在查询中动态使用列名,更不用说自定义类型了。但是,如果您要使用,这将是相当容易实现的。再想想,我已经为您发布了一个可能的解决方案;)