为列中的值获取长度为 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 的子字符串并在输出中放入单列?的主要内容,如果未能解决你的问题,请参考以下文章

使用 MySQL 或 H2 将空值替换为列中的最新值

为列中的每个唯一值分配值[重复]

mysql - 为列中的每个值选择不重复的[重复]

如何替换整个数据库中的字符串(数据值)?

使用 pandas python 将字符串日期转换为列中所有值的数字

我的表有多个列,我想获取每列中的值计数并在 postgresql 中分别显示每列的计数值