INSERT语句SELECT CONCAT

时间:2017-05-29 17:40:21

标签: mysql sql

表应如下所示:

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%

接下来 elisa elisa4

INSERT语句:

startTime = "9:00AM"
endTime = "11:00AM"

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

3 个答案:

答案 0 :(得分:0)

一些傲慢的家伙会坚持你需要使用一个数据库序列,但是根据你想要完成的事情,类似的东西会与Oracle合作:

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

或者,如果您的数字可能存在差距并且具有独特的数字,那么这类问题可能会更令人满意:

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。

数据库序列版本:

INSERT INTO patients VALUES(
    patient_name_seq.currval,
    'b','d',
    CONCAT('elisa',patient_name_seq.nextval));

答案 1 :(得分:0)

有两个问题:

  1. SET用于更新,而非插入。查询应具有

    形式
    INSERT INTO patients (a, c, "name")
    SELECT 
        'b'
      , 'd'
      , CONCAT('elisa', CASE WHEN COUNT(idname) = 0 THEN '' ELSE COUNT(idname) END) 
    FROM patients WHERE name LIKE 'elisa%'
    
  2. CONCAT('elisa', CASE WHEN COUNT(idname) = 0 THEN '' ELSE COUNT(idname) END)会导致价值idname& name之后的后缀,即idname = 2name = elisa1的行。这与问题中所要求的内容不同。

    要改变这一点,我们可以写

    CONCAT('elisa', COUNT(idname)+1)
    

答案 2 :(得分:0)

你可以这样做

INSERT INTO patients (a, c, name)
SELECT 'b', 'd', CONCAT('elisa', COALESCE((
    SELECT SUBSTRING(MAX(name), CHAR_LENGTH('elisa') + 1) + 1
      FROM patients
     WHERE name LIKE 'elisa%'
), ''));

仅供参考:此类查询是竞争条件的主题,并不保证生成的name值的唯一性。两个或更多个连接可以同时获得相同的值。因此,您需要在客户端代码中处理这些情况,即捕获唯一的约束违例异常并重试此查询几次,直到您获得成功结果。

这是dbfiddle演示

结果:

+--------+------+------+--------+
| idname | a    | c    | name   |
+--------+------+------+--------+
|      1 | b    | d    | elisa1 |
|      2 | b    | d    | elisa2 |
|      3 | b    | d    | elisa3 |
|      4 | b    | d    | elisa4 |
+--------+------+------+--------+