Re: [SQL ] Insert or Replace 如何分别给值?

楼主: GALINE (天真可爱CQD)   2022-10-25 11:43:50
※ 引述《liu2007 (薯)》之铭言:
: 数据库名称:SQLITE
: 数据库版本:SQLITE 3
: 内容/问题描述:
: 我有一个表如下
: CREATE TABLE myTable(
: id TEXT NOT NULL UNIQUE,
: name TEXT ,
: descript TEXT ,
: confirmed NOT NULL);
: 我想要做的事情是每当有一笔新的资料进来的时候
: 如果资料表里面没有id 这笔资料的话就新增(insert)
: 如果有的话,又假如name 和 descript 的原始内容与此笔薪资料的内容相同,
: 则 confirmed = 'yes', 反之 confirmed = 'no'
: 下面是我的语法
: INSERT OR replace INTO test (id, name, descript, confirmed)
: VALUES ('001', 'aaa', CASE WHEN name = 'aaa' AND descript = 'bbb'
: THEN 'YES' ELSE 'no' END
: );
: 本来以为可以像在select上使用case when ,但却报错
: 讯息却是Result: no such column: name
直觉想法是“居然是抱怨找不到字段而不是喷 syntax error”
回头一想,其实没真的搞懂过 sqlite(以及其他数据库们)怎么解算字段名称
: 即使是加上myTable.name仍然报相同的错误讯息
可以预期不会成功,因为这个 row 还没 insert 进 myTable
所以 myTable.name 应该不会解到想要的字段
: 请问该怎么改呢?
: 感谢阅读
倒是有想到几个解法
首先是可以原样倒进暂存表,然后 INSERT .. INTO .. SELECT
事后再把暂存表 DROP 掉
```
sqlite> CREATE TABLE tmp (id TEXT NOT NULL UNIQUE, name TEXT, descript TEXT);
sqlite> INSERT INTO tmp (id, name, descript)
...> VALUES ('A01', 'aaa', 'bbb'), ('A02', 'yyy', 'zzz');
sqlite> SELECT * FROM tmp;
A01|aaa|bbb
A02|yyy|zzz
sqlite> INSERT INTO myTable (id, name, descript, confirmed)
...> SELECT id, name, descript, CASE WHEN name='aaa' THEN 'YES' ELSE 'NO' END
...> FROM tmp;
sqlite> SELECT * FROM myTable;
A01|aaa|bbb|YES
A02|yyy|zzz|NO
sqlite> DROP TABLE tmp;
```
如果 INSERT 是你用其他 script 产生的
也可以直接把 name 换成字段内容
```
sqlite> INSERT INTO myTable (id, name, descript, confirmed) VALUES
...> ('A03', 'aaa', 'xxx', CASE WHEN 'aaa'='aaa' THEN 'YES' ELSE 'NO' END),
...> ('A04', 'bbb', 'xxx', CASE WHEN 'bbb'='aaa' THEN 'YES' ELSE 'NO' END);
sqlite> SELECT * FROM myTable;
A01|aaa|bbb|YES
A02|yyy|zzz|NO
A03|aaa|xxx|YES
A04|bbb|xxx|NO
```
不过如果用到其他语言读 csv 档
直接在其他语言里面把字段做对,不在 SQL 处理搞不好更快

Links booklink

Contact Us: admin [ a t ] ucptt.com