回答

收藏

编写Postgres获取或创建SQL查询

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

我想编写一条Postgres) a8 q3 Y4 L& k$ K8 B, b- C1 r
SQL语句,该语句表示查找颜色X和亮度Y的用户。如果该用户存在,则返回其所有行数据。如果不是,请创建新行并传递其他信息。这两个单独的语句将执行以下操作:3 f/ Q  Q+ e$ f8 X' ^$ {9 `
Select (color, brightness, size, age) FROM mytable WHERE color = 'X' AND brightness= 'Y';& ?" o5 q! E& ~$ F4 n' V8 A
如果那什么都不返回,那么执行以下命令:1 b9 L- V- F' Z+ j+ O7 N. T
INSERT INTO mytable (color, brightness, size, age) VALUES (X, Y, big, old);
2 ^7 ]5 G/ ?  U# _* C( ^, ]9 J有没有一种方法可以将这些组合成一个查询?6 d0 m' u& ?, \2 N4 ?
                ! D" v+ u; f  [% g+ V7 e0 h5 L
解决方案:# j9 `3 m" ?1 @; G2 K
               
/ ~, s7 e: y/ W# r" T' y, M9 Z( F, ~6 m

% O( P9 m  {. S2 y$ o, \  E0 i                在SQL DBMS中,select-test-- N0 q$ I2 _8 {! a' i/ t3 }
insert方法是一个错误:没有什么可以阻止另一个进程在您的select和insert语句之间插入“缺少”行。改为执行此操作:
) X5 U; x, A( L" Oinsert into mytable (color, brightness, size, age)3 \0 N7 D8 ~4 v0 z3 t6 k
select color, brightness, size, age
& o/ m7 B- b, t$ v* }. a; rfrom mytable
* B' x8 m. O/ i6 s% Y6 m  @where not exists () S* T% b5 p; s5 j2 S" i
    select 1 from
* W4 o* g& m% m' [  Z% U- c    from mytable& w( t3 r; Q; v; f  u) ?5 n$ }
    where color = 'X' and brightness = 'Y'' Q# j1 _! I2 `) c
);0 L" F/ u9 q2 n8 e
SELECT (color, brightness, size, age)
) L2 `9 ~9 o, BFROM mytable
" c- g# o- C4 `! a9 n* L7 iWHERE color = 'X' AND brightness= 'Y';  J: a- C1 R( T8 C# \
您应该能够将整个文本作为单个“查询”传递给DBMS。您可能要考虑使其成为存储过程。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则