我开始学习Oracle PL / SQL,我下载了Oracle Database 10g Express,并提供了相同的示例和问题。
有一个我无法解决的问题。
问题是:
编写SQL查询以检索名字,姓氏和代码 找到员工代码的每位员工如下: 首先删除所有出现的字符“i”和“l”,然后, 连接名称的前六个字母,一个短划线“ - ”,和 姓氏的最后六个字符,只有第一个和最后一个 代码的字符应该是大写的。如果名称没有 包含六个字母,下划线(“”)到作品的末尾;如果 姓氏不包含六个字母,下划线(“”) 作品的开头。根据姓氏订购列表,和 然后根据名字。
输出必须
我写了一些东西,但这完全错了,不清楚。我应该修复哪些部分?
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;
这是我的输出(错误)
答案 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);
我假设您只想替换i
和l
而不是I
和L
。在这种情况下,翻译的行为与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。随意添加更多数据。