【问题标题】:How to return a variable-langth string from a string如何从字符串中返回可变长度字符串
【发布时间】:2022-08-10 02:19:16
【问题描述】:

我有以下数据集:

Ident Script
ID1 Var_xxx_calc + Var_yyy_db + Var_zzz_calc
ID2 Var_xxx_calc + Var_zzz_db

有没有办法把它分成下表?

Ident Script Var1 Var2 Var3
ID1 Var_xxx_calc + Var_yyy_db + Var_zzz_calc Var_xxx_calc Var_yyy_db Var_zzz_calc
ID2 if Var_xxx_calc + Var_zzz_db > 10 then \'OK\' else \'NOK\' Var_xxx_calc Var_zzz_db null

额外难度: Var_% 都有不同的长度,我只知道它们以 \'Var_\' 开头

我使用 Oracle 生产版本 19.12.0.0.0

  • 你能详细说明一下吗?您想要动态表还是只想查找脚本列的长度或查找 \'+\' 字符串的数量?
  • 它们以 var_% 开头,但是否有任何分隔符或模式?例如; Var_% whitespace(特殊字符,如 \"+\" 或 \">\")whitespaceVar_% 。

标签: sql oracle toad


【解决方案1】:

试图找到解决方案并以有限的解决方案结束。我使用强制植入 SCRIPT 的分隔符,而不是任何可能位于“Var_something”字符串之前或之后的字符。您将在代码中将其视为“无尽”替换。这个想法是在您尝试分隔的字符串之后设置一个分隔符,如果它是可能的。
以下是 WITH 子句生成的一些示例数据的代码:

WITH
    tbl AS
        (
            Select 'ID_1' "IDENT", 'Var_xxxxx_calculus + Var_yyy_dbase + Var_zz_calc' "SCRIPT" From Dual Union All
            Select 'ID_2' "IDENT", 'Var_xxxxx_calcul + Var_yyy_dbase' "SCRIPT" From Dual Union All
            Select 'ID_3' "IDENT", 'If Var_xxx_calc + Var_zzz_db* 2 > 10 then "OK" else "NOK"' "SCRIPT" From Dual Union All
            Select 'ID_4' "IDENT", 'Some other text without Var foloved by underscore' "SCRIPT" From Dual Union All
      Select 'ID_5' "IDENT", 'And some with "Var_"  Var_A, Var_B, Var_C in it' "SCRIPT" From Dual
        )
SELECT
    IDENT "IDENT",
    SCRIPT "SCRIPT",
    CASE 
        WHEN VAR_COUNT > 0 THEN 
            SubStr( SCRIPT_DELIMITED, 
                    InStr(SCRIPT_DELIMITED, 'Var_', 1, 1), 
                    InStr(SCRIPT_DELIMITED, ';', InStr(SCRIPT_DELIMITED, 'Var_', 1, 1), 1) - InStr(SCRIPT_DELIMITED, 'Var_', 1, 1) 
                  ) 
    END "VAR_1",
    CASE 
        WHEN VAR_COUNT > 1 THEN 
            SubStr( SCRIPT_DELIMITED, 
                    InStr(SCRIPT_DELIMITED, 'Var_', 1, 2), 
                    InStr(SCRIPT_DELIMITED, ';', InStr(SCRIPT_DELIMITED, 'Var_', 1, 2), 1) - InStr(SCRIPT_DELIMITED, 'Var_', 1, 2) 
                  ) 
    END "VAR_2",
    CASE 
        WHEN VAR_COUNT > 2 THEN 
            SubStr( SCRIPT_DELIMITED, 
                    InStr(SCRIPT_DELIMITED, 'Var_', 1, 3), 
                    InStr(SCRIPT_DELIMITED, ';', InStr(SCRIPT_DELIMITED, 'Var_', 1, 3), 1) - InStr(SCRIPT_DELIMITED, 'Var_', 1, 3) 
                  ) 
    END "VAR_3",
    CASE 
        WHEN VAR_COUNT > 3 THEN 
            SubStr( SCRIPT_DELIMITED, 
                    InStr(SCRIPT_DELIMITED, 'Var_', 1, 4), 
                    InStr(SCRIPT_DELIMITED, ';', InStr(SCRIPT_DELIMITED, 'Var_', 1, 4), 1) - InStr(SCRIPT_DELIMITED, 'Var_', 1, 4) 
                  ) 
    END "VAR_4"
FROM
    (
        SELECT
          IDENT "IDENT",
          SCRIPT "SCRIPT",
          CASE 
                WHEN InStr(SCRIPT, 'Var_', 1, 4) > 0 THEN 4
                WHEN InStr(SCRIPT, 'Var_', 1, 3) > 0 THEN 3
                WHEN InStr(SCRIPT, 'Var_', 1, 2) > 0 THEN 2
                WHEN InStr(SCRIPT, 'Var_', 1, 1) > 0 THEN 1
          ELSE 0
          END "VAR_COUNT",
          Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(SCRIPT, ' ', ';'), '+', ';'), '>', ';'), '<', ';'), '=', ';'), '"', ';'), '*', ';'), ',', ';') || ';' "SCRIPT_DELIMITED"
        FROM
            tbl
    )

此处限制为为分隔符选择了四个变量,并且条件是除了使用替换函数处理的分隔符之外没有其他分隔符。
样本数据的结果是:

--  IDENT SCRIPT                                                    VAR_1                                                      VAR_2                                                      VAR_3                                                      VAR_4                                                    
--  ----- --------------------------------------------------------- ---------------------------------------------------------- ---------------------------------------------------------- ---------------------------------------------------------- ----------------------------------------------------------
--  ID_1  Var_xxxxx_calculus + Var_yyy_dbase + Var_zz_calc          Var_xxxxx_calculus                                         Var_yyy_dbase                                              Var_zz_calc                                                                                                           
--  ID_2  Var_xxxxx_calcul + Var_yyy_dbase                          Var_xxxxx_calcul                                           Var_yyy_dbase                                                                                                                                                                    
--  ID_3  If Var_xxx_calc + Var_zzz_db* 2 > 10 then "OK" else "NOK" Var_xxx_calc                                               Var_zzz_db                                                                                                                                                                       
--  ID_4  Some other text without Var foloved by underscore                                                                                                                                                                                                                                                     
--  ID_5  And some with "Var_"  Var_A, Var_B, Var_C in it           Var_                                                       Var_A                                                      Var_B                                                      Var_C 

问候...

【讨论】:

    猜你喜欢
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 2023-01-26
    • 2012-02-24
    相关资源
    最近更新 更多