Oracle PL / SQL字符串格式

时间:2013-04-03 01:50:07

标签: sql database oracle plsql oracle10g

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

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

问题是:

  

编写SQL查询以检索名字,姓氏和代码   找到员工代码的每位员工如下:   首先删除所有出现的字符“i”和“l”,然后,   连接名称的前六个字母,一个短划线“ - ”,和   姓氏的最后六个字符,只有第一个和最后一个   代码的字符应该是大写的。如果名称没有   包含六个字母,下划线(“”)到作品的末尾;如果   姓氏不包含六个字母,下划线(“”)   作品的开头。根据姓氏订购列表,和   然后根据名字。

输出必须

enter image description here

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


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;

这是我的输出(错误) enter image description here

3 个答案:

答案 0 :(得分: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); 

我假设您只想替换il而不是IL。在这种情况下,翻译的行为与replace(replace(str, 'l', ''), 'i', '')相同。

答案 1 :(得分: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

答案 2 :(得分: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的第3个参数,因为该函数默认使用空字符串。

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