回答

收藏

SQLite-在一条语句中进行SELECT或INSERT和SELECT

技术问答 技术问答 433 人阅读 | 0 人回复 | 2023-09-14

我试图避免编写单独的SQL查询来实现以下情况:
2 ?* X% }) }5 q0 c我有一个称为值的表:
# H4 z' [; n; E) |7 k3 L' c值:
: x5 t% f! J# q6 c# D/ x/ z  Q5 ~id INT (PK)7 \+ ?. O" f" x
data TEXT
3 a: A7 y/ Z/ H+ K我想检查表中是否存在某些数据,如果存在,则返回其ID,否则将其插入并返回其ID。2 J! [: R# [: d) w6 m. T
(非常)幼稚的方式是:
. `5 n0 ^8 }! J; }8 `+ t2 iselect id from Values where data = "SOME_DATA";
- R' D! T* Q( v) r+ }6 j! C如果id不为null,请接受。如果id为null,则:
6 W# w$ U1 w& R5 \. G5 M) m  o: b" Ainsert into Values(data) values("SOME_DATA");! Y0 _; v' b4 x7 x
然后再次选择它以查看其ID或使用返回的ID。
6 x5 w4 s, B& {  [9 }2 _  T+ r9 l我正在尝试使上述功能合而为一。我想我已经接近了,但我还没做到:到目前为止,我明白了这一点:
: E4 K: }0 C# }% n7 Hselect id from Values where data=(COALESCE((select data from Values where data="SOME_DATA"), (insert into Values(data) values("SOME_DATA"));
+ a8 _7 F: s  Q7 p5 Z- s. D我正在尝试利用以下事实:第二个选择将返回null,然后将返回COALESCE的第二个参数。到目前为止没有成功。我想念什么?5 G( \1 |3 p$ Z4 l7 F" i
                0 }( D1 E! R6 Q3 y+ `, p  P
解决方案:& O7 P' Y. M2 v6 _) J1 e
                ' p# W3 p/ n& B" ^5 A2 _- n8 m  \

5 ?. Z7 ?1 y* O* c: e! y: X$ }: Q; V8 ~' Z1 Z
                您的命令不起作用,因为在SQLINSERT中不会返回值。/ |4 p5 R' K6 |& ^4 l
如果data列上有唯一的约束/索引,则可以在盲目插入该值时使用它来防止重复。这使用了SQLite的INSERT OR
& d; @8 ~! ~; V! g) _7 t& S; T# A) mIGNORE扩展名:2 c/ X1 n$ Z) r. X0 o* W4 t8 U
INSERT OR IGNORE INTO "Values"(data) VALUES('SOME_DATE');
: r8 u& O4 s. E4 e( TSELECT id FROM "Values" WHERE data = 'SOME_DATA';
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则