使用 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 JOINLEFT 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 将数字转换为相应的文本的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询 有啥函数可以将数字转换成大写的

如何使用非默认 NLS_NUMERIC_CHARACTERS 在 Oracle PL/SQL 中有效地将文本转换为数字?

在excel中如何将输入的数字自动转换为日期

SQL中如何将数值格式的20110801(2011年8月01日)转换为日期格式的201108或者2011-08?

VBA 如何将数字转换为中文大写

如何将数字转换为文本[重复]