作者GALINE (天真可爱CQD)
看板Database
标题Re: [SQL ] Insert or Replace 如何分别给值?
时间Tue Oct 25 11:43:50 2022
※ 引述《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 处理搞不好更快
----
其实还想到 DECLARE 变数然後一直 SET 这种烂招
不过完全不实际...
--
莉~娜~在~我~们~之~间~有~名~吗~?
打倒了魔王大人,被那位大人附体之後平安无事地打倒了冥王大人
击退了霸王大人,然後又打倒了魔王大人。
这种家伙还不有名?魔族有那麽粗神经吗?有那麽没危机意识吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 218.166.99.151 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Database/M.1666669434.A.2D7.html