使用case语句创建低和高范围

时间:2017-05-15 20:50:10

标签: sql postgresql

我的借款人表格中有以下案例陈述

SELECT borrower_id,
   CASE
     WHEN bo.fico_score >= 0 AND bo.fico_score <= 599 THEN '0-599'
     WHEN bo.fico_score >= 600 AND bo.fico_score <= 649 THEN '600-649'
     WHEN bo.fico_score >= 650 AND bo.fico_score <= 699 THEN '650-699'
     WHEN bo.fico_score >= 700 AND bo.fico_score <= 749 THEN '700-749'
     WHEN bo.fico_score >= 750 AND bo.fico_score <= 800 THEN '750-800'
     WHEN bo.fico_score > 800 AND bo.fico_score <= 850 THEN '801-850'
   END AS "Borrower FICO"
from borrowers bo;

用例要求我提供低范围和高范围而不是上述范围。以下代码有效。

SELECT borrower_id,
   CASE
     WHEN bo.fico_score >= 0 AND bo.fico_score <= 599 THEN '0'
     WHEN bo.fico_score >= 600 AND bo.fico_score <= 649 THEN '600'
     WHEN bo.fico_score >= 650 AND bo.fico_score <= 699 THEN '650'
     WHEN bo.fico_score >= 700 AND bo.fico_score <= 749 THEN '700'
     WHEN bo.fico_score >= 750 AND bo.fico_score <= 800 THEN '750'
     WHEN bo.fico_score > 800 AND bo.fico_score <= 850 THEN '801'
   END AS "Borrower FICO LOW",
   CASE
     WHEN bo.fico_score >= 0 AND bo.fico_score <= 599 THEN '599'
     WHEN bo.fico_score >= 600 AND bo.fico_score <= 649 THEN '649'
     WHEN bo.fico_score >= 650 AND bo.fico_score <= 699 THEN '699'
     WHEN bo.fico_score >= 700 AND bo.fico_score <= 749 THEN '749'
     WHEN bo.fico_score >= 750 AND bo.fico_score <= 800 THEN '800'
     WHEN bo.fico_score > 800 AND bo.fico_score <= 850 THEN '850'
   END AS "Borrower FICO HIGH",
from borrowers bo;

我认为这不是很好的设计。是否有更好的方法来编写此案例陈述,以便为借款人信用评分提供低和高范围?

1 个答案:

答案 0 :(得分:1)

您可以使用原始查询并将结果字符串拆分为&#39; - &#39;,例如:

with borrowers(borrower_id, fico_score) as (
values
    (1, 133),
    (2, 633)
)

select 
    borrower_id, 
    split_part(fico, '-', 1) as "Borrower FICO Low",
    split_part(fico, '-', 2) as "Borrower FICO High"
from (
    select borrower_id,
       case
         when bo.fico_score >= 0 and bo.fico_score <= 599 then '0-599'
         when bo.fico_score >= 600 and bo.fico_score <= 649 then '600-649'
         when bo.fico_score >= 650 and bo.fico_score <= 699 then '650-699'
         when bo.fico_score >= 700 and bo.fico_score <= 749 then '700-749'
         when bo.fico_score >= 750 and bo.fico_score <= 800 then '750-800'
         when bo.fico_score > 800 and bo.fico_score <= 850 then '801-850'
       end as fico
    from borrowers bo
    ) s;

 borrower_id | Borrower FICO Low | Borrower FICO High 
-------------+-------------------+--------------------
           1 | 0                 | 599
           2 | 600               | 649
(2 rows)