为列中的值获取长度为 1 或 2 的子字符串,并在输出中放入单列?

Get substring of length 1 or 2 for values in a column and put in single column in output?

我有一列包含字母数字代码 (elcode)。我正在尝试在我的 select 输出中创建一个新列,其中包含一个基于代码字段的前一个或两个字符的值,使用 SUBSTR()CASE WHEN (TAXA_GROUP),但我不知道如何做到这一点,以便所有 CASE WHEN 结果都在一个列中。

示例: 三个示例代码:AM1234、AR1357、PD9876。对于前两个,我需要看前两个字符。第一个将在我的输出中转换为 'mammal',第二个将转换为 'reptile.' 对于最后一个,我只需要查看第一个字符,它将在我的输出中转换为 'plant'输出。在整个数据集中,我需要评估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 - 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>

我会使用 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 条件,而不是只比较一个值。