【问题标题】:Reading a part of a alpha numeric string in SQL在 SQL 中读取字母数字字符串的一部分
【发布时间】:2009-08-05 04:08:45
【问题描述】:

我有一个包含一列“ otname ”的表 table1.otname 包含多行类似于以下数据示例的字母数字字符串:

11.10.32.12.U.A.F.3.2.21.249.1

2001.1.1003.8281.A.LE.P.P.

2010.1.1003.8261.A.LE.B.B

我想读取每个字符串中的第四个数字(部分字符串以粗体显示)并在 Oracle 10g 中编写查询 读取存储在另一个表中的描述。我的困境是写查询的第一部分。即选择表中每个字符串的第四个数字

我的第二个查询将是这样的:

select description_text from table2 where sncode = 8281  -- fourth part of the data sample in every string

非常感谢。

新手

【问题讨论】:

    标签: sql oracle oracle10g


    【解决方案1】:

    适用于 9i+:

    WITH portion AS (
      SELECT SUBSTR(t.otname, INSTR(t.otname, ".", 1, 3)+1, INSTR(t.otname, ".", 1, 4)) 'sncode'
        FROM TABLE t)
    SELECT t.description_text
      FROM TABLE2 t
      JOIN portion p ON p.sncode = t.sncode
    

    SUBSTR的使用应该很明显; INSTR 用于查找句点 (.) 的位置,从字符串中的第一个字符(参数值 1)开始,在字符串中出现的第 3 次和第 4 次。您可能需要从该周期的第四个实例返回的位置中减去一个 - 首先测试这个以确保您获得正确的值:

    SELECT SUBSTR(t.otname, INSTR(t.otname, ".", 1, 3)+1, INSTR(t.otname, ".", 1, 4)) 'sncode'
     FROM TABLE t
    

    我使用了子查询分解,因此子字符串发生在您加入第二个表之前。它可以作为子查询完成,但子查询分解更快。

    【讨论】:

    • 运行上述查询时出现以下错误:ORA: 00923: FROM keyword not found where expected :(
    • 我没有要测试的 Oracle 实例,但我能看到的唯一争论点是第一个 INSTR 中的“+1”。您确定在您尝试运行的 FROM 和表名之间有一个空格?
    【解决方案2】:

    较新版本的 oracle(包括 10g)具有各种正则表达式功能。所以你可以这样做:

    where sncode = to_number(regexp_replace(otname, '^(\d+\.\d+\.\d+\.(\d+))?.+$', '\2'))
    

    这匹配 3 组数字后跟一个点,以及第四组数字,然后是字符串的其余部分,并返回一个字符串,该字符串由完全被第一组替换的所有字符组成(第四组数字)。

    这是一个完整的查询(如果我正确理解了您对这两个表的描述):

    select t2.description_text
    from table1 t1, table2 t2
    where t2.sncode = to_number(regexp_replace(t1.otname, '^(\d+\.\d+\.\d+\.(\d+))?.+$', '\2'))
    

    另一个略短的替代正则表达式:

    where t2.sncode = to_number(regexp_replace(t1.otname, '^((\d+\.){3}(\d+))?.+$', '\3'))
    

    【讨论】:

    • 我运行了您的查询,我收到以下错误:ORA-01722: invalid number Any Suggestions ?
    • 我想我认为你的“sncode”也是一个字符串。让我知道它是否真的是一个数字。同时,我正在更新我的答案以反映这一点,因此您可以尝试一下(“to_number”函数)。
    • 谢谢。 sncode 实际上是一个数字。 otname 是字母数字
    • 我仍然看到同样的错误:ORA-01722:无效号码。还有其他想法吗?
    • 是的,我正要说,这实际上应该无关紧要。甲骨文会强制转换(但它可以在索引方面有所帮助)。可能存在带有与您描述的模式不匹配的字符串的行。我可以调整正则表达式来处理它,在这些情况下返回 null。但是你能确认这是否可能吗?还是字符串总是以 4 个虚线数字开头?
    猜你喜欢
    • 2019-09-06
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2015-02-02
    • 2021-12-09
    相关资源
    最近更新 更多