使用 SQL 将数字转换为相应的文本
Posted
技术标签:
【中文标题】使用 SQL 将数字转换为相应的文本【英文标题】:Converting a number to corresponding text using SQL 【发布时间】:2020-08-17 18:16:48 【问题描述】:利用 Oracle Apex 上的 OEHR_EMPLOYEES
表,我想将 DEPARTMENT ID
列值转换为相应的单词。例如,值为 10 的DEPARTMENT ID
将变为'HR'
,值为 20 的DEPARTMENT ID
将变为'Finance'
,等等。DEPARTMENT ID
目前是一个数字数据类型。我什至不知道从哪里开始这项任务..
【问题讨论】:
不了解 Apex,但在 Oracle 中,您可以使用 decode docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/… 函数或内部联接与单独的部门表,将 ID 转换为名称 样本数据和预期数据会有所帮助。您是在问如何在 SQL 中进行查找? 【参考方案1】:数据库应该保存这些值,您应该连接到另一个包含该数据的表。 例如:
所以你应该有一个包含数据的第一个表(例如人)
ID name address deparmentID
1 hadi tehran 10
2 mahsa saqqes 20
然后是另一个包含部门列表的表
id department
10 HR
20 Finance
然后你会在这些表之间做一个连接
select people.name, department.department
from people, department
where people.deparmentID= department.ID
【讨论】:
【参考方案2】:假设(请在以后的问题中包含列):
OEHR_EMPLOYEES 有 EMPLOYEE_ID、EMPLOYEE_NAME、DEPARTMENT_ID 列 DEPARTMENTS 有 DEPARTMENT_ID、DEPARTMENT_NAME 列
类似:
SELECT e.employee_id, e.employee_name, d.department_name
FROM oehr_employees e, departments d
WHERE e.department_id = d.department_id;
或者:
SELECT e.employee_id, e.employee_name,
( SELECT d.department_name FROM departments d WHERE e.department_id = d.department_id ) department_name
FROM oehr_employees e;
【讨论】:
虽然这看起来是正确的,但您一定是在开玩笑,建议我们在 1980 年代使用的连接语法,因为那时还没有发明显式连接(INNER JOIN
、LEFT OUTER JOIN
等)。跨度>
【参考方案3】:
有几个选项。如果您同时拥有 OEHR_EMPLOYEES 和 OEHR_DEPARTMENTS(表),您可以看到 OEHR_DEPARTMENTS 包含部门名称,映射到部门 ID。
--
-- ... means: more columns/rows
--
select * from oehr_employees ;
EMPLOYEE_ID FIRST_NAME LAST_NAME ... DEPARTMENT_ID ...
100 Steven King 90
101 Neena Kochhar 90
...
select * from oehr_departments ;
DEPARTMENT_ID DEPARTMENT_NAME ...
10 Administration ...
20 Marketing ...
30 Purchasing ...
40 Human Resources ...
50 Shipping ...
60 IT ...
70 Public Relations...
80 Sales ...
90 Executive ...
100 Finance ...
因此,您可以编写如下示例中的 JOIN。请注意,您可以在 SELECT 子句中添加更多列,以获得所需的结果(例如 FIRST_NAME、EMAIL、SALARY 等)。
select
employee_id
, last_name
, department_name
from
oehr_employees join oehr_departments using ( department_id )
;
-- result
EMPLOYEE_ID LAST_NAME DEPARTMENT_NAME
200 Whalen Administration
201 Hartstein Marketing
202 Fay Marketing
114 Raphaely Purchasing
115 Khoo Purchasing
...
-- another way of coding this, with table aliases
select
E.employee_id
, E.last_name
, D.department_name
from
oehr_employees E
join
oehr_departments D on E.department_id = D.department_id
;
-- same result as above
如果您想使用与 OEHR_DEPARTMENTS 表中的不同的部门名称,您可以使用“case expression”将数字替换为字符串(注意这些是 没有存储在您的数据库中,它们是在您执行查询时“生成”的)。
select
employee_id
, last_name
, case department_id
when 10 then 'HR'
when 20 then 'Finance'
when 30 then 'Admin'
when 40 then 'Shipping'
when 50 then 'Accounting'
when 60 then 'PR'
when 70 then 'Exec'
when 80 then 'Estates'
when 90 then 'Customer Services'
when 100 then 'H&S'
else 'other'
end departmentname
from oehr_employees ; -- no join required, as we use "our own" department names
-- result
EMPLOYEE_ID LAST_NAME DEPARTMENTNAME
100 King Customer Services
101 Kochhar Customer Services
102 De Haan Customer Services
103 Hunold PR
104 Ernst PR
105 Austin PR
您也可以使用 DECODE 来代替 case 表达式(正如评论中提到的 @Dornaut)。
【讨论】:
以上是关于使用 SQL 将数字转换为相应的文本的主要内容,如果未能解决你的问题,请参考以下文章
如何使用非默认 NLS_NUMERIC_CHARACTERS 在 Oracle PL/SQL 中有效地将文本转换为数字?