首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >INSERT语句选择CONCAT

INSERT语句选择CONCAT
EN

Stack Overflow用户
提问于 2017-05-29 17:40:21
回答 2查看 6.3K关注 0票数 0

表应该如下所示:

代码语言:javascript
复制
idname a  c name
1      b  d  elisa1
2      b  d  elisa2
3      b  d  elisa3

下一个elisa将是elisa4

以及插入的声明:

代码语言:javascript
复制
INSERT INTO patients 
SET a=b, c=d (name) 
SELECT CONCAT('elisa', CASE WHEN COUNT(idname) = 0 THEN '' ELSE COUNT(idname) END), 
FROM patients WHERE name LIKE 'elisa%

INSERT语句根本不会添加任何记录。

EN

回答 2

Stack Overflow用户

发布于 2017-05-29 18:49:32

有些傲慢的家伙会坚持你需要使用数据库序列,但取决于你想要实现的目标,比如将使用Oracle:

代码语言:javascript
复制
INSERT INTO patients VALUES(
    (SELECT COUNT(*) FROM patients WHERE name LIKE 'elisa%'),
    'b','d',
    (SELECT CONCAT('elisa', CASE WHEN COUNT(idname) THEN 0 ELSE COUNT(idname) END) FROM patients WHERE name LIKE 'elisa%'));

或者,如果你可能在数字上有差距,并且拥有独特的、不断增加的数字很重要,这样的事情可能会被证明更令人满意:

代码语言:javascript
复制
INSERT INTO patients VALUES(
    (SELECT NVL(MAX(idname),0)+1 FROM patients WHERE name LIKE 'elisa%'),
    'b','d',
    CONCAT('elisa', (SELECT NVL(MAX(idname),0)+1 FROM patients WHERE name LIKE 'elisa%')));

请记住,如果同时进行多个事务,这些操作将不能正常工作。为此,您将需要一个数据库序列,但随后将为所有名称设置一组数字,因此elisa5后面将跟着bob6和joe7。

数据库序列版本:

代码语言:javascript
复制
INSERT INTO patients VALUES(
    patient_name_seq.currval,
    'b','d',
    CONCAT('elisa',patient_name_seq.nextval));
票数 0
EN

Stack Overflow用户

发布于 2017-05-29 18:49:33

有两个问题:

  1. SET用于更新,而不是插入。查询应该具有以下形式 在病人中插入(a,c," name "),从病人中选择'b‘,'d’,CONCAT('elisa',当计数(Idname)=0时,从名为'elisa%‘的病人中插入’END COUNT(idname)结束‘。
  2. CONCAT('elisa', CASE WHEN COUNT(idname) = 0 THEN '' ELSE COUNT(idname) END)将导致值idname & name后面的后缀(即idname = 2name = elisa1 )行之间的滞后。这与问题中所表示的不同。 要改变这种状况,我们可以写 (“elisa”,计数(Idname)+1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44247945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档