如何格式化输出以使其输出为句子?

时间:2019-11-02 18:40:12

标签: sql oracle

编写SQL进行检索,以便为提交维修的每个设备检索其序列号,描述,销售日期,请求维修的客户名称,维修说明以及维修费用。 (需要加入两个表)。

格式化输出,以便以如下句子形式输出:

  

“家电9001 DVD播放器的维修,于2018年1月1日出售给A.GREEN,以解决DVD Stuck问题将花费67.50欧元”。

如果不存在十进制值,请确保输出零。

不知道该用什么来格式化输出..搜索了dbms并打印,但是我不确定这是否是问题所在。提前谢谢!

客户表

CUSTID | CUSTNAME | CUSTPHONE | CUSTEMAIL
1001     Aaa        0123        GReen@mail.com
1002     BBB        0121        bbb@mail.com 
1003     CCCC       0333        ccc@mail.com 

appRepair表

serialNO | RepairDate| RepairDesc| repairCost | Customer_ID
9001       4-Mar-18       0123        67.5          1001
9002       4-JUN-18       0121        60.7          1002
9003       4-AUG-18       0333        102.5         1003

电器表

serialNO |    appDESC     | APPSALEDATE | GUARENTEELENGTH 
9001       DVD PLAYER       1-jan-18          2         
9002       FRIDGE FREEZER   3-may-18          5         
9003       48 TV            5-jun-18          2       

我用于选择查询的代码

select appliance.serialNo, appliance.appDesc, TO_CHAR(appliance.appSaleDate, 'DDTH MONTH YY') AS "SALE DATE", 
UPPER(Customer.custName) AS "CUSTOMER NAME", Customer.custEmail from appliance 
inner join appRepair ON appliance.serialNo=appRepair.serialNo
inner join Customer ON appRepair.customer_id=Customer.custID;

预期输出:

  

“家电9001 DVD播放器的维修,于2018年1月1日出售给A.GREEN,以解决DVD Stuck问题将花费67.50欧元。”

3 个答案:

答案 0 :(得分:1)

您需要的是这样的

     select 'The repair to appliance ' 
           || appliance.serialNo 
           || ' ' || appliance.appDesc 
           || ', sold on ' 
           || LTRIM(to_char(appliance.appSaleDate,'ddth Month YYYY','NLS_DATE_language=American'), 0)
           || ' to ' || UPPER(Customer.custName) 
           || ', to solve the issue' 
           || appRepair.RepairDesc || ' will cost ' 
           || ltrim(to_char(appRepair.repairCost, 'L9990.99'))
    from appliance 
    inner join appRepair ON appliance.serialNo = appRepair.serialNo
    inner join Customer ON appRepair.customer_id = Customer.custID;

这将解决日期格式:

select LTRIM(to_char(sysdate,'ddth Month YYYY','NLS_DATE_language=American'), 0) 
from dual;

这将解决数字格式:

select to_char(00.00, 'L990.99') 
from dual;

我没有您的桌子,但是如果出现任何错误,请告诉我,我将尽力提供帮助。这是DEMO的用法,因此您可以查看日期和数字格式的工作方式。

答案 1 :(得分:1)

您可以使用包含多个串联的查询:

select 'The repair to appliance '||a.serialNo||' '||a.appDesc||
       ', sold on '||to_char(a.appSaleDate, 'DDTH MONTH RRRR')||
       ' to '||upper(substr(c.custEmail,1,instr(c.custEmail,'@')-1))||
       ' to solve the issue '||substr(a.appDesc,1,instr(a.appDesc,' ')-1)||
       ' Stuck will cost '|| 
         ltrim(to_char(repairCost, 'U999G999D00',
                       'NLS_NUMERIC_CHARACTERS = ''.,''NLS_DUAL_CURRENCY=EUR'))
        as "Output"
  from appliance a
  join appRepair ar on a.serialNo=ar.serialNo
  join customer c on ar.customer_id=c.custID;

Demo

如果您的NLS_CHARACTERSET数据库参数为WE8ISO8859P1,则可以用

替换Output列的最后一部分
' Stuck will cost '||unistr('\20AC')|| 
             ltrim(to_char(repairCost, '999G999D00',
                           'NLS_NUMERIC_CHARACTERS = ''.,'''))

能够看到欧元符号。

答案 2 :(得分:0)

您可以用concat() / ||进行构造或替换。以下是示例:

select (case when count(*) <> 1
             then 'There are ' || count(*) ' rows in the table'
             else 'There is ' || count(*) ' row in the table'
        end)
from t;

或者:

select replace(replace(replace('There [tobe] [cnt] row[plural] in the table'),
                               '[tobe]',
                               (case when count(*) = 1 then 'is' else 'are' end)
                              ), '[cnt]', count(*)

                       ), [plural], (case when count(*) = 1 then '' else 's' end)
                end)

我将让您适应特定的数据。