Oracle PL/SQL字符串格式

Oracle PL/SQL字符串格式,sql,database,oracle,plsql,oracle10g,Sql,Database,Oracle,Plsql,Oracle10g,我开始学习Oracle PL/SQL,并下载了Oracle Database 10g Express,附带了相同的示例和问题 有一个问题我无法解决 问题是: 编写SQL查询以检索名字、姓氏和代码 每个员工的代码如下所示: 首先删除所有出现的字符“i”和“l”,然后, 将名称的前六个字母、破折号“-”和 姓氏的最后六个字符,其中只有第一个和最后一个字符 代码的字符应为大写。如果名称不为大写 包含六个字母,在文章末尾加下划线(“”);如果 姓氏不包含六个字母,请在下面加下划线(“”) 作品的开头。根

我开始学习Oracle PL/SQL,并下载了Oracle Database 10g Express,附带了相同的示例和问题

有一个问题我无法解决

问题是:

编写SQL查询以检索名字、姓氏和代码 每个员工的代码如下所示: 首先删除所有出现的字符“i”和“l”,然后, 将名称的前六个字母、破折号“-”和 姓氏的最后六个字符,其中只有第一个和最后一个字符 代码的字符应为大写。如果名称不为大写 包含六个字母,在文章末尾加下划线(“”);如果 姓氏不包含六个字母,请在下面加下划线(“”) 作品的开头。根据姓氏对列表进行排序,然后 然后根据名字

输出必须是这样的

我写了一些东西,但完全错了,不清楚。我应该修复哪些部分?


这是我的输出(错误)
你可以这样写:

select first_name, last_name, f
       ||'-'
       ||substr(l, 1, length(l) - 1)
       ||upper(substr(l, -1)) code
  from (select first_name, last_name,
               initcap(rpad(substr(translate(first_name, 'xil', 'x'), 1, 6), 6,
                       '_')) f,
               lpad(substr(translate(last_name, 'xil', 'x'),
                           greatest(-6, -length(translate(last_name, 'xil', 'x')))), 6,
                          '_')
                          l
          from employees); 

我假设您只想替换
i
l
,而不想替换
i
l
。在这种情况下,translate的作用与
replace(replace(str,'l','','','i','')
相同。

此代码在某种程度上遵循您的原始逻辑:

SELECT e."First_Name", e."Last_Name",
       initcap(rpad(replace(replace(e."First_Name", 'l'), 'i'),6,'_'))
       || '-' ||
       reverse(initcap(reverse(lpad(replace(replace(e."Last_Name", 'l'), 'i'),6,'_')))) "Code"
FROM Employees e
ORDER BY e."Last_Name", e."First_Name";
我使用了两次
REVERSE
,这样我也可以使用
INITCAP
作为姓氏。我还省略了
REPLACE
的第三个参数,因为函数默认使用空字符串


这是一个基于部分数据的I构建。请随意添加更多数据。

此代码完全符合您的要求: 用所需的值替换列名和表名

SELECT ENAME,
       JOB,
          INITCAP (RPAD (REPLACE (REPLACE (ENAME, 'I'), 'i'), 6, '_'))
       || '-'
       || LPAD (
             reverse (
                INITCAP (
                   SUBSTR (reverse ( (REPLACE (REPLACE (JOB, 'I'), 'i'))),
                           1,
                           6))),
             6,
             '_')
          code
  FROM emp 
  ORDER BY JOB, Ename

replace(replace(first_name,'l','','i')
中,您实际将“
i
”替换为什么?实际上我想将其替换为null或“”,但如果我添加替换字符,它会给出关于“参数编号太多”的错误,那么您为什么不这样做?为什么您只是将“
l
”替换为空字符串,而不是“
i
”?因为据我所知,replace函数需要2个参数学习SQL很好。学习疑难解答更好。疑难解答的第一步是“分而治之”。在这种情况下,这意味着将表达式简化为更简单的形式,检查它,然后将其包装到下一级表达式中,检查它,依此类推,直到得到答案正确。因此,首先检查
replace(first_name,'l','')
是否返回您期望的结果(将其放入自己的列中)从那里开始。但它没有给出预期的输出。例如,列名非常复杂。列名应该如上图所示:)@hakiko该示例用于代码部分。请参见此处添加其他两个原始列:这是一个很好的解决方案,但我已经有了数据、表和列。在您的链接中,您使用了您最好的方法创建了它。:)Que关于现有数据的问题。Oracle Express提供了现成的数据库用于执行示例:)什么?只有您添加了“f”并且所有的可视性都已更改。谢谢:)
SELECT ENAME,
       JOB,
          INITCAP (RPAD (REPLACE (REPLACE (ENAME, 'I'), 'i'), 6, '_'))
       || '-'
       || LPAD (
             reverse (
                INITCAP (
                   SUBSTR (reverse ( (REPLACE (REPLACE (JOB, 'I'), 'i'))),
                           1,
                           6))),
             6,
             '_')
          code
  FROM emp 
  ORDER BY JOB, Ename