0

再会,

我有一个我一直试图解决的独特问题。

基本上,我根据客户端的请求从服务器获取大量数据。

我从不知道列是什么或表是什么,所以我设法创建了一个动态函数来处理数据,如下所示。

let _Insert_replace_string = (table, columns) => {
    var string = 'INSERT INTO ' + table + ' (`TIMESTAMP`, `ERROR`, `LOCALID`'
    for (let xx = 4; xx < columns.length; xx++) {
      let element2 = columns[xx];
      string += ', `' + element2 + '`'
    }
    string += ') VALUES ($TIMESTAMP, $ERROR, $LOCALID'
    for (let xx = 4; xx < columns.length; xx++) {
      let element2 = columns[xx];
      string += ', $' + element2
    }
    string += ')'
    string += ' ON CONFLICT(LOCALID) DO UPDATE'
    string += ' SET `TIMESTAMP`=$TIMESTAMP, `ERROR`=$ERROR'
    for (let xx = 4; xx < columns.length; xx++) {
      let element2 = columns[xx];
      string += ', `' + element2 + '`=$' + element2
    }
    string += ' WHERE LOCALID=$LOCALID'

    console.log(string)

    return string;
  }

这对我的需求非常有效(因为我可以在几秒钟内插入 50 000+ 行)但是在来自服务器的第二个请求中,可以说我有如下表(客户端)''表示字符串''不包含任何内容(不空等)

+---------+------+------+------+------+
| LOCALID | col2 | col3 | col4 | col5 |
+---------+------+------+------+------+
| xx3     | ''   | 123  | ''   | 123  |
+---------+------+------+------+------+
| av1     | b    | 456  | ''   | 456  |
+---------+------+------+------+------+
| po2     | c    | ''   | c    | 789  |
+---------+------+------+------+------+

所以如果服务器向下发送行

[xx3, abc, '', abc, '']

发生的事情是表格现在更新为

+---------+------+------+------+------+
| LOCALID | col2 | col3 | col4 | col5 |
+---------+------+------+------+------+
| xx3     | abc  | ''   | abc  | ''   |
+---------+------+------+------+------+
| av1     | b    | 456  | ''   | 456  |
+---------+------+------+------+------+
| po2     | c    | ''   | c    | 789  |
+---------+------+------+------+------+

我想要发生的是检查服务器上''的值,并确保它不会用它们更新客户端,所以结果是

+---------+------+------+------+------+
| LOCALID | col2 | col3 | col4 | col5 |
+---------+------+------+------+------+
| xx3     | abc  | 123  | abc  | 123  |
+---------+------+------+------+------+
| av1     | b    | 456  | ''   | 456  |
+---------+------+------+------+------+
| po2     | c    | ''   | c    | 789  |
+---------+------+------+------+------+

我试图改变声明

for (let xx = 4; xx < columns.length; xx++) {
       let element2 = columns[xx];
       string += ', `' + element2 + '`=$' + element2
     }

for (let xx = 4; xx < columns.length; xx++) {
       let element2 = columns[xx];
       string += ',(CASE WHEN $' + element2 + '!="" THEN `' + element2 + '`=$' + element2 + ' END)';
     }

但它似乎不起作用,我已经通过 stackoverflow 搜索和搜索,但我的问题没有什么是独特的,大多数事情都处理 SELECT 或表中已经存在的数据。我总是想要来自服务器的最新信息,我对必须覆盖的客户端信息不感兴趣。

4

0 回答 0