所以我有一个看起来像这样的查询:
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
语句,而不是尝试查找您使用某些CASE
或REPLACE
语句获取描述的每一段代码。