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'; |
|
|
|
|
|