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