为列中的值获取长度为 1 或 2 的子字符串并在输出中放入单列?
Posted
技术标签:
【中文标题】为列中的值获取长度为 1 或 2 的子字符串并在输出中放入单列?【英文标题】:Get substring of length 1 or 2 for values in a column and put in single column in output? 【发布时间】:2021-03-12 18:01:13 【问题描述】:我有一列包含字母数字代码 (elcode)。我正在尝试在我的选择输出中创建一个新列,该列包含一个基于代码字段的前一个或两个字符的值,使用 SUBSTR()
和 CASE WHEN
(TAXA_GROUP),但我不知道如何为此,所有CASE WHEN
结果都在一个列中。
示例: 三个示例代码:AM1234、AR1357、PD9876。对于前两个,我需要查看前两个字符。第一个将在我的输出中转换为“哺乳动物”,第二个将转换为“爬行动物”。对于最后一个,我只需要查看第一个字符,这将在我的输出中转换为“植物”。在整个数据集中,我需要评估 5 个双字符子字符串和 4 个单字符子字符串。
我可以生成包含两个单独列的内容,一个包含评估那些两个字符的子字符串产生的值,另一个包含一个字符的子字符串产生的值,但我真的希望它们都放在同一个最后一栏。这是我目前正在做的事情:
SELECT EG.elcode
, CASE SUBSTR(EG.elcode, 1, 2) WHEN 'AM' THEN 'mammal'
WHEN 'AR' THEN 'reptile' END AS TAXA_GROUP
, CASE SUBSTR(EG.elcode, 1, 1) WHEN 'P' THEN 'plant' END AS TAXA_GROUP
上面生成的输出包含两个 TAXA_GROUP 列,一个填充了哺乳动物、爬行动物和 null,另一个填充了植物和 null:
elcode | TAXA_GROUP | TAXA_GROUP |
---|---|---|
AM1234 | mammal | null |
AR1357 | reptile | null |
PD9876 | null | plant |
我想要一个 TAXA_GROUP 列,其中包含这两个 SUBSTR()
命令的结果。
elcode | TAXA_GROUP |
---|---|
AM1234 | mammal |
AR1357 | reptile |
PD9876 | plant |
我尝试连接两列,但出现错误:
SELECT EG.elcode
, CASE SUBSTR(EG.elcode, 1, 2) WHEN 'AM' THEN 'mammal'
WHEN 'AR' THEN 'reptile' END AS TAXA_GROUP1
, CASE SUBSTR(EG.elcode, 1, 1) WHEN 'P' THEN 'plant' END AS TAXA_GROUP2
, TAXA_GROUP1 || TAXA_GROUP2 AS TAXA_GROUP
Error: An error occurred while running query. ORA-00904: "TAXA_GROUP2": invalid identifier
在我在这个网站上的搜索中,我发现了类似的问题,但大多数与使用SUBSTR()
相关,当您不知道字符串有多长(需要正则表达式)时,这里不是这种情况。
【问题讨论】:
你能使用全局临时表吗?这样你就可以加入临时表,该表将包含代码和全名。然后,您只需使用通配符针对代码加入反对它。如果您打算多次运行它,也可以将其存储为普通表 【参考方案1】:#1 - 5 行中的样本数据;完成这项工作的代码从第 6 行开始。
SQL> with test (elcode) as
2 (select 'AM1234' from dual union all
3 select 'AR1357' from dual union all
4 select 'PD9876' from dual
5 )
6 select elcode,
7 case when substr(elcode, 2, 1) = 'M' then 'mammal'
8 when substr(elcode, 2, 1) = 'R' then 'reptile'
9 when substr(elcode, 1, 1) = 'P' then 'plant'
10 end taxa_group
11 from test;
ELCODE TAXA_GROUP
------ ----------
AM1234 mammal
AR1357 reptile
PD9876 plant
SQL>
【讨论】:
谢谢@Littlefoot!我从来没有想过如果CASE
场景在WHEN
之前或之后会发生什么。这真的很有用,我相信有一天我需要用SUBSTR()
来做这件事。我只接受了@GordonLinoff 的回答,因为在这种情况下,LIKE
会起作用,而且更简单。【参考方案2】:
我会使用LIKE
。比较简单:
select elcode,
(case when elcode like 'AM%' then 'mammal'
when elcode like 'AR%' then 'reptile'
when elcode like 'P%' then 'plant'
end) taxa_group
from t;
但关键是您需要单独的 case
条件,而不是只比较一个值。
【讨论】:
谢谢你,@GordonLinoff!在这种情况下,LIKE
确实让事情变得更干净、更简单。我不知道为什么我从一开始就没有考虑使用它。以上是关于为列中的值获取长度为 1 或 2 的子字符串并在输出中放入单列?的主要内容,如果未能解决你的问题,请参考以下文章