【问题标题】:String replacement based on condition in OracleOracle中基于条件的字符串替换
【发布时间】:2021-01-22 04:16:14
【问题描述】:


我正在处理一些要求,我需要根据某些特定条件显示一些数据。
以下是我在这里给出的值作为示例。
条件类似于如果列的前 4 个字符是 NUMERIC 那么它将进一步检查它是否有 SPACE 否则在 4 个字符之后给出右侧部分。
如果它会寻找 SPACE,那么如果 SPACE 的右侧有任何 DOT,它将进一步寻找,如果是,则给出右侧DOT 的一部分。

Column1         Column_new   
-----------     ----------         
22 50.IND1 E    IND1 E
RYST 22S2E      22S2E
2608.S1 E       S1 E
0540BS2         BS2

这是我正在尝试的代码,但仍然需要一些修改,因为我对同一 case 语句中的多个条件感到困惑

SELECT COLUMN1,
  CASE
    WHEN LENGTH(TRIM(TRANSLATE(SUBSTR(t1.COLUMN1,0,4), '0123456789',' '))) IS NULL
    THEN (
      CASE
        WHEN instr(t1.COLUMN1,'.')>0
        THEN SUBSTR(t1.COLUMN1,instr(t1.COLUMN1,'.')+1,LENGTH(t1.COLUMN1))
        ELSE t1.COLUMN1
      END)
    WHEN instr(t1.COLUMN1,' ')>0
    THEN trim(SUBSTR(t1.COLUMN1,instr(t1.COLUMN1,' ')+1,LENGTH(t1.COLUMN1)))
      --     when instr(t1.COLUMN1,'.')>0
      --        then (case when instr(trim(substr(t1.COLUMN1,instr(t1.COLUMN1,' '),length(t1.COLUMN1))),'.')>0 then substr(trim(substr(t1.COLUMN1,instr(t1.COLUMN1,' '),length(t1.COLUMN1))),
    ELSE t1.COLUMN1
  END AS COLUMN_NEW
FROM TABLE t1
WHERE ...
AND ...
AND ... ;

【问题讨论】:

  • 请添加一些无法通过测试的真实样本数据。找不到匹配项时应该返回什么? NULL 还是原始字符串?

标签: sql oracle substring regexp-substr


【解决方案1】:

通常您会使用正则表达式来解决这类问题。您可能正在寻找以下内容:

SELECT COLUMN1, REGEXP_REPLACE(COLUMN1,'^([0-9 ]{4}|.* )(.*\.)?','') COLUMN_NEW 
  FROM TABLE t1

【讨论】:

  • 谢谢你,但它似乎与我的所有输出都不匹配。
  • 它与您给出的所有示例相匹配。您可以使用表达式并自行改进以匹配您想要的结果或发布一些失败的输出,以便我们提供帮助...
猜你喜欢
  • 1970-01-01
  • 2015-09-15
  • 2021-10-08
  • 2014-03-13
  • 1970-01-01
  • 2021-10-19
  • 2016-10-02
  • 1970-01-01
相关资源
最近更新 更多