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



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

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维护一列结果

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

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

也许更好的是加入厕所类型表?

在这种情况下,我认为您想要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;

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

select 
  incidentnumber, 
  decode(ToiletteType, 'A', 'Automatic Standard', 'P', 'Portable Potty', ToiletteType),
  toiletdangers,
  incidentdate
from 
  core.lostlawsuits;

只是为了完整起见:在 Oracle 中,还有可以使用的decode函数,如

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

这导致打字比CASE... WHEN... END少一点但我更喜欢CASE因为它与 ANSI SQL 兼容。

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

这也确保了在您的"丢失诉讼"表中仅使用有效的马桶类型。

最后,这意味着如果将来添加新的 ToiletType,它只是成为 ToiletType 表中的单个INSERT语句,而不是尝试查找您使用某些CASEREPLACE语句获取描述的每一段代码。

最新更新