iT邦幫忙

2

趣味SQL之SQLite insert with case condition

sql
  • 分享至 

  • xImage

在ptt database 看到這個
按我前往

我稍微修改了一下

create table t1030 (
  id int not null primary key
, tname text
, tdesc text
, tconfirm bool not null
);

insert into t1030 values
(001, 'aaa', 'bbb'
, case 
  when tname = 'aaa' and tdesc = 'bbb' then true
  else false
  end);
  
Parse error: no such column: tname
  to t1030 values (001, 'aaa', 'bbb' , case    when tname = 'aaa' and tdesc = 'bbb'
                                      error here ---^

可以看到出現了錯誤.

大家可以試試看,怎樣解決這個.

當然我有一個初步的方法.

直接看

第二次的

看更多先前的討論...收起先前的討論...
rogeryao iT邦超人 7 級 ‧ 2022-10-30 14:32:24 檢舉
我想要做的事情是每當有一筆新的資料進來的時候

如果資料表裡面沒有id 這筆資料的話就新增(insert)

如果有的話,又假如name 和 descript 的原始內容與此筆薪資料的內容相同,
則 confirmed = 'yes', 反之 confirmed = 'no'
------------------------------------------------------
我的理解是 :
A. id 欄位內沒有 1 時,【新增一筆】 1 且 confirmed = no
B. id 欄位內已經有 1 且 name 及 descript 皆相同時,則【只要修改】 confirmed = yes
其實我的方法 跟他的問題 一點關係都沒有啊~~~
因為我只有看到 他後面的SQL , 所以我是針對 那段 case .
現在我再來看看他的問題.
我那個table 最後 tconfirm bool not null, 應該改為 沒有 not null.
話說..照理說是不可以新增資料的...應該用exists...擋
補充了第二次的了,連結放在上面.
rogeryao iT邦超人 7 級 ‧ 2022-10-30 19:28:31 檢舉
第二次的結果,與我的結果一樣有瑕疵
https://dbfiddle.uk/uj0ZtfpH
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
純真的人
iT邦大師 1 級 ‧ 2022-10-30 12:25:07

關於原po問題~
我都是用exists方式判斷~無資料才新增@@...
或者有資料新增失敗也是可以記錄~

insert into t1030 
select 001
  , 'aaa'
  , 'bbb'
  ,ifnull((
    select false
    from t1030
    where tname = 'aaa' 
    and tdesc = 'bbb'
    LIMIT 1
  ),true);

https://dbfiddle.uk/849VZlVW

0
rogeryao
iT邦超人 7 級 ‧ 2022-10-30 15:52:25

借用純真的人的程式碼修改了一下,尚有瑕疵(第四次:id 相同時 tname,tdesc 會被取代);
不過可以看出來是 tconfirm = 0 ,也就是這筆資料未經過第二次確認。

REPLACE into t1030 
select '001'
  , 'aaa'
  , 'bbb'
  ,ifnull((
    select true
    from t1030
    where id='001'
    and tname = 'aaa' 
    and tdesc = 'bbb'
    LIMIT 1
  ),false);

Demo

但是因為primary key的連續編號關係~他應該會有這樣的...

insert into t1030 
select 002
  , 'aaa'
  , 'bbb'
  ,ifnull((
    select false
    from t1030
    where tname = 'aaa' 
    and tdesc = 'bbb'
    LIMIT 1
  ),true);
0
ckp6250
iT邦好手 1 級 ‧ 2022-10-30 18:44:19

我懶得想,
直接用 stored procedure 來處理。

0
OuJiaHao
iT邦新手 4 級 ‧ 2022-10-31 11:29:33

如果需求是存在就進行更新 不存在進行新增
在 MSSQL 中也可以透過 Merge 的語法

https://learn.microsoft.com/zh-tw/sql/t-sql/statements/merge-transact-sql?view=sql-server-ver16

我要發表回答

立即登入回答