在Oracle中使用Regex_substr选择字符串直到\ n字符长度

时间:2016-07-13 11:36:25

标签: sql regex oracle substr

我们遇到的问题是,Oracle数据库中的列的字符长度比另一个系统中的字段长。

因此,我尝试将case语句与substr一起使用,以便拆分长度超过40个字符的字符串。到目前为止我的case语句做了我希望他们做的事情,它在column_a中保留字符串的前40个字符,然后将字符串的其余部分放在column_b中。

但是,我遇到的问题是,只使用substr,字符串就会在单词中间分开。

所以我想知道是否有人知道我可以使用regex_substr的几个正则表达式 -

  1. 选择一个字符串UP到40个字符以内的最后一个空格 - for column_a
  2. 选择40个字符以内的最后一个空格后的字符串 - for column_b
  3. 这是我到目前为止使用substr:

    的案例陈述
    CASE WHEN Length(column_a) > 10 THEN SubStr(column_a, 0, 40) END AS column_a,
    
    CASE WHEN Length(column_a) > 40 THEN SubStr(addressnum, 41) END AS column_b
    

    我根本不熟悉正则表达式,因此非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

我用instr / substr解决了:

<ul>
      <li ng-repeat="qlist in response | unique:'quesListName'">
            {{qlist.quesListName}}
   </li>
<ul>

答案 1 :(得分:0)

今天在OTN上发布了一个非常类似的问题。 https://community.oracle.com/message/13928697#13928697

我发布了一个通用解决方案,它也将涵盖此处提出的问题。如果将来有类似的需求,它可能会派上用场。

对于此处发布的问题,(function () { 'use strict'; angular .module('flavorApplication') .controller('UsedSearchesController', UsedSearchesController); UsedSearchesController.$inject = ['$stateParams', '$state', 'DataService', '_']; function UsedSearchesController($stateParams, $state, DataService, _) { var vm = this; vm.currentSearches = $stateParams.search.split("|") activate(vm); //////////////// function activate(vm, _) { vm.removeSearch = function (searchTerm) { $stateParams.search = _.filter(vm.currentSearches, function(search){return search !== searchterm}).join("|") $state.go('home'); } } } })();表格只有一行,row_lengthsr_id = 1。出于演示目的,我在下面显示的r_len = 40与我在OTN上使用的不同。

<强>设置

input_strings

查询和输出 :(注意:我包含令牌长度以验证第一个令牌不超过40个字符。如果SECOND令牌可以超过40个字符,则OP无法应答;如果它不能,可以向create table input_strings (str_id number, txt varchar2(500)); insert into input_strings values (1, 'One Hundred Sixty-Nine Thousand Eight Hundred Seventy-Four Dollars And Nine Cents'); insert into input_strings values (2, null); insert into input_strings values (3, 'Mathguy rules'); create table row_lengths (r_id number, r_len number); insert into row_lengths values (1, 40); commit; select * from input_strings; STR_ID TXT ------- --------------------------------------------------------------------------------- 1 One Hundred Sixty-Nine Thousand Eight Hundred Seventy-Four Dollars And Nine Cents 2 3 Mathguy rules 3 rows selected select * from row_lengths; R_ID R_LEN ------- ---------- 1 40 1 row selected. 表添加行,每行可能有row_lengths。)

r_len = 40