5

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

有一个我无法解决的问题。

问题是:

编写一个 SQL 查询来检索每个员工的名字、姓氏和代码,其中找到员工的代码如下:首先删除所有出现的字符“i”和“l”,然后连接第一个姓名的六个字母、一个破折号“-”和姓氏的最后六个字符,其中只有代码的第一个和最后一个字符应为大写。如果名称不包含六个字母,则在片尾加下划线(“<em>”);如果姓氏不包含六个字母,则将下划线(“</em>”)放在乐曲的开头。先按姓氏排序,再按姓名排序。

输出必须是这样的

在此处输入图像描述

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


SELECT employees.first_name, employees.last_name,
replace(replace(first_name,'l',''),'i'),
initcap(substr(rpad(employees.first_name,6,'_'),1,6)) || '-' ||

case when length(employees.last_name)>4
then lower(substr(employees.last_name,-5,4))
else lower(substr(lpad(employees.last_name,5,'_'),-5,4)) end ||
upper(substr(employees.last_name,-1,1)) code

FROM employees
ORDER BY last_name, first_name;

这是我的输出(错误) 在此处输入图像描述

4

3 回答 3

3

你可以这样写:

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

我假设您只想替换iandl而不是Iand L。translate 将与这种情况下的行为相同replace(replace(str, 'l', ''), 'i', '')

于 2013-04-03T02:09:22.773 回答
1

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

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
于 2013-04-03T10:18:58.200 回答
0

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

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因为该函数默认使用空字符串。

这是我根据您的部分数据构建的SQL Fiddle DEMO 。随意添加更多数据。

于 2013-04-03T03:27:31.207 回答