在oracle查询中拆分字符串

时间:2017-06-10 07:54:12

标签: c# oracle

我希望在Oracle中根据长度将字符串拆分为空格作为分隔符。

例如,

`MY_STRING="Before continuing, turn off the top title display without changing its definition:"`

我的输出应该是

`STRING1="Before continuing, turn off the"`
`STRING2="top title display without changing"`
`STRING3="its definition:"`

字符串的长度最多为35个字符。位置105之后的单词可以忽略。

2 个答案:

答案 0 :(得分:0)

您已标记C#,因此我选择了语言来回答您。我希望它有所帮助。它完美地分割了文本。 关于规则,在您的情况下,它将文本分为3部分。 这是结果:

STR1 :"Before continuing, turn off the"

STR2 :" top title display without changing"

STR3 :" its definition:"

static void Main(string[] args)
{
    const string txt = "Before continuing, turn off the top title display without changing its definition:";
    var txtArr = txt.ToCharArray();
    var counter = 0;
    var stringList = new List<string>();
    var str = string.Empty;
    for (var i = 0; i < txt.Count(); i++)
    {
        counter++;
        if (counter == 35)
        {
            while (txtArr[i].ToString() != " ")
            {
                i--;
                str = str.Remove(i);
            }
            stringList.Add(str);
            str = string.Empty;
            counter = 0;
        }
        str = str + txtArr[i];
    }
    stringList.Add(str);
}

这就是我在ORACLE(PL / SQL)中实现算法的方法。忽略错误并查看output 返回3行并正常运行 。现在编写一些额外的代码并根据需要进行修改。这个错误似乎并不重要,我不知道原因是什么。

declare 
--
txt nvarchar2(1000):='Before continuing, turn off the top title display without changing its definition:';
charc nvarchar2(1):='';
TYPE txtArrTyp IS VARRAY(1000) OF NVARCHAR2(1); 
txtArr txtArrTyp :=txtArrTyp();
--
str nvarchar2(35):='';
cntr number:=0;
j number:=0;
lent number:=0;
begin
  --
 lent:=LENGTHB(txt);
  --
for i In 1 ..lent
  loop
    if(txt is null )then
      dbms_output.put_line('SHIT');
    end if;    
    charc := SUBSTR(txt,i,1);
    txtArr.extend;
    txtArr(i):=charc;
  end loop;
  --
While(j>=1 or j<=lent)
  loop
  j:=j+1;
  cntr :=cntr+1;  
  if(cntr = 35) then
   while(txtArr(j)<>' ')
     loop
       j:=j-1;
     end loop; 
   str:=substr(str,0,j);
   dbms_output.put_line(str);
   str:=null;
   cntr:=0;  
  end if;
  str := str || txtArr(j);
  end loop; 
  dbms_output.put_line(str);
end;

答案 1 :(得分:0)

用存储的函数完成它:

create or replace FUNCTION get_part(p_value IN VARCHAR2, part in number)
RETURN VARCHAR2
    IS temp VARCHAR2(1000);
BEGIN
    temp := p_value;
    FOR i IN 1 .. (part-1) LOOP
        if (Length(temp) <35) then
            return '';
        ELSE
            FOR j in REVERSE 1 .. 35 LOOP
                if SUBSTR(temp,j,1) = ' ' then
                    temp := SUBSTR(temp,j+1);
                    EXIT;
                end if;
            END LOOP;
            temp := SUBSTR(temp,36);
        end if;
    END LOOP;
    if (Length(temp) <=35) then
        return temp;
    else
        FOR j in reverse 1 .. 35 LOOP
            if SUBSTR(temp,j,1) = ' ' then
                return SUBSTR(temp,1,j-1);
            end if;
        END LOOP;
        return SUBSTR(temp,1,35);
    end if;

END;

用法:

select 
get_part(string_value,1), 
get_part(string_value,2), 
get_part(string_value,3) from ( select 'Before continuing, turn off the top title display without changing its definition:' string_value from dual) 

如果超过35个没有空格的字符肯定会失败,我会把它留给你

编辑:如果没有空格,现在应该在35个字符之后进行分割