Oracle SQL:Select语句中嵌套REPLACE()的替代方法?

时间:2016-02-01 15:21:55

标签: sql oracle

所以我的查询看起来像这样:

SELECT IncidentNumber, 
    ToiletType, 
    ToiletDangers,
    IncidentDate
FROM Core.LostLawsuits

...返回以下结果:

+----------------+------------+---------------------------+---------------+
| IncidentNumber | ToiletType | ToiletDangers             | Incident Date |
+----------------+------------+---------------------------+---------------+
| 2100           | A          | Spontaneous Combustion    | 2/1/2016      |
+----------------+------------+---------------------------+---------------+
| 2101           | P          | Attracts Bear Stampede    | 2/1/2016      |
+----------------+------------+---------------------------+---------------+

我想要做的是获取结果,但在输出时更改ToiletType列结果。目前,我正在使用嵌套的REPLACE(),并想知道是否有更好/不同的方式,同时保持ToiletType 的一列结果:< / p>

SELECT IncidentNumber, 
    REPLACE(REPLACE(ToiletType, 'A', 'Automatic Standard'), 'P', 'Portable Potty') as ToiletType,
    ToiletDangers,
    IncidentDate
FROM Core.LostLawsuits

5 个答案:

答案 0 :(得分:4)

CASE表达式适用于您的示例:

case ToiletType
   when 'A' then 'Automatic Standard'
   when 'P' then 'Portable Potty'
   end

SELECT IncidentNumber, 
       case ToiletType
          when 'A' then 'Automatic Standard'
          when 'P' then 'Portable Potty'
       end as ToiletType,
       ToiletDangers,
       IncidentDate
FROM   Core.LostLawsuits

或许更好的是加入一个ToiletTypes表?

答案 1 :(得分:3)

在这种情况下,我认为你想要CASE

SELECT IncidentNumber, 
       (CASE ToiletType
            WHEN 'A' THEN 'Automatic Standard'
            WHEN 'P' THEN 'Portable Potty'
            ELSE ToiletType
        END) as ToiletType,
      ToiletDangers,
      IncidentDate
FROM Core.LostLawsuits;

答案 2 :(得分:3)

您也可以尝试decode功能,但我怀疑您是否会有任何性能或可读性改进:

$("#textarea").keyup(function(e){        
    console.log($('#textarea').val());
});

答案 3 :(得分:2)

仅为了完整性:在Oracle中,还有可以使用的decode函数,如

select decode(ToiletType, 'A', 'Automatic Standard', 
                          'P', 'Portable Potty', 
                          'Unknown Type '||ToiletType) ...

导致的输入比CASE... WHEN... END少一点 但我更喜欢CASE,因为它与ANSI SQL兼容。

答案 4 :(得分:1)

ToiletType应该是查找表的外键。查找表至少包含两列 - 一个ToiletTypeCode和一个ToiletTypeDescription。您需要在现有表和新查找表之间使用外键以确保参照完整性。

一旦到位,查询就变得微不足道了:

SELECT
    LL.IncidentNumber,
    TT.ToiletTypeDescription AS ToiletType,
    LL.ToiletDangers,
    LL.IncidentDate
FROM Core.LostLawsuits LL
INNER JOIN Core.ToiletTypes TT ON TT.ToiletTypeCode = LL.ToiletType

这也确保您的LostLawsuits表中仅使用有效的厕所类型。

最后,这意味着如果将来添加一个新的ToiletType,它只会成为ToiletTypes表的单个INSERT语句,而不是试图搜索你使用了{{1}的所有代码。 }或CASE语句来获取描述。