【问题标题】:Concatenating the first character of first name and the last name in Oracle SQL在Oracle SQL中连接名字和姓氏的第一个字符
【发布时间】:2020-10-15 07:46:29
【问题描述】:

问题:Oracle SQL 的新手,无法弄清楚这一点。任何帮助表示赞赏。 :)

在表employee2中,为每个学生的username列生成电子邮件地址 连接员工名字的第一个字符和员工的姓氏。为了 例如,员工 Peter Stone 的用户名将是 pstone。注意:用户名在所有 小写字母。

我尝试过的:

select 
  concat(left(firstname, 1) + ' ',left(lastname)) UserName
from employee2;

选择 concat(substring(firstname, 1),substring(lastname)) 用户名 来自员工 2;

【问题讨论】:

  • 那么到底是什么问题?
  • @Mureinik 上面的代码给了我错误,如上所述,我需要编写一个查询,将名字的第一个字符与姓氏连接起来,并将其添加到 employee2 表中名为“用户名”的列中.
  • 愿意分享错误吗?
  • ORA-00904: "LEFT": invalid identifier 00904. 00000 - "%s: invalid identifier" *原因:*操作:错误行:94 列:35 @Mureinik

标签: sql oracle


【解决方案1】:

您应该使用substr 和串联运算符||,如下所示:

Update employee2
   Set username = lower(substr(firstname,1,1) || lastname)

使用|| 而不是concat 函数的好处是,如果需要组合两个以上的字符串,则需要多次调用concat|| 是字符串运算符,易于使用和阅读。

【讨论】:

    【解决方案2】:
    select (substr(firstname, 1,1) || lower(lastname)) as UserName 
     from employee2;
    

    【讨论】:

    • 如何将此数据插入到已存在且在employee2 表中为空的字段用户名中
    • @CuzWhyNotVlogs 使用合并子句更新现有行并在不匹配时插入
    • 那么你会怎么写上面的查询呢?
    【解决方案3】:

    这里有几个问题:

    1. Oracle 没有 left 函数 - 但您可以使用 substr 来生成该效果。
    2. Oracle 中的字符串由|| 运算符连接,而不是+
    3. 您应该将用户名转换为小写:
    SELECT TOLOWER(SUBSTR(firstname, 1, 1) || lastname) AS username
    FROM   employee2
    

    【讨论】:

    • ORA-00904: "TO_LOWER": invalid identifier 00904. 00000 - "%s: invalid identifier" *Cause: *Action: Error at Line: 93 Column: 8 在用户名列中也出现此错误已经存在它只是空的需要用名字+姓氏标准来填充它
    • @CuzWhyNotVlogs arg,抱歉,应该是 lower,而不是 tolower。已编辑和修复。
    【解决方案4】:
    MERGE INTO employee 2 
    USING (select (substr(firstname, 1,1) || lower(lastname)) as UserName 
     from employee 1) ilv;
    ON ilv.username = 2.username
       
        WHEN NOT MATCHED THEN
            INSERT (username)
            values(ilv.username);
    

    【讨论】:

      【解决方案5】:
      UPDATE employee2
      SET username = lower(CONCAT(substr(firstname, 1,1),lastname));
      

      感谢大家的帮助,可能没有正确解释我的问题,但这是我想要实现的输出。

      【讨论】:

        【解决方案6】:
        select lower(concat(substr(firstname,1,1),lastname)) Username from employee2;
        
        or 
        
        select lower(substr(firstname,1,1)||lastname)  from employee2;
        
        Insert with select
        
        SQL> create table test (id number,uname varchar2(100));
        
        SQL> insert into test
          2  select rownum,lower(concat(substr(first_name,1,1),last_name))||'@gmail.com'
          3  from employees;
        
        108 rows created.
        
        
        SQL> commit;
        
        Commit complete.
        
        
        SQL> select * from test
          2  fetch first 5 rows only;
        
                ID UNAME
        ---------- ----------------------------------------------------------------------------------------------------
                 1 eabel@gmail.com
                 2 sande@gmail.com
                 3 matkinson@gmail.com
                 4 daustin@gmail.com
                 5 hbaer@gmail.com
        
        
        SQL>
        

        【讨论】:

        • 我试图插入这些数据而不是仅仅选择它。那么这个查询将如何变化? @山姆
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 2012-09-12
        • 1970-01-01
        相关资源
        最近更新 更多