• 拆分字符串函数


    本函数可以将“目标字符串”以“指定字符串”进行拆分,并通过表结构返回结果。

    在SQL Service中的代码如下:

     1 CREATE FUNCTION [dbo].[fnSPLIT]
     2 (
     3     @sInputString varchar(8000) 
     4     , @sSplitChar varchar(10)
     5 )RETURNS @tbl_List TABLE (SEQ INT IDENTITY(1,1),COD varchar(8000) )
     6 AS
     7 
     8 BEGIN
     9     DECLARE @lInputStringLength Int ,
    10             @lPosition Int ,
    11             @lSplitChar Int 
    12 
    13     SET @lInputStringLength = LEN ( @sInputString )
    14     SET @lPosition=1
    15     SET @lSplitChar=1
    16 
    17     WHILE @lPosition <= @lInputStringLength
    18         BEGIN
    19             SET @lSplitChar = CHARINDEX ( @sSplitChar , @sInputString , @lPosition)
    20             IF @lSplitChar = 0
    21                 BEGIN
    22                     INSERT @tbl_List (COD )
    23                     SELECT SUBSTRING( @sInputString , @lPosition ,1+ @lInputStringLength - @lPosition)
    24                     SET @lPosition= @lInputStringLength + 1
    25                 END
    26             ELSE
    27                 BEGIN
    28                     INSERT @tbl_List ( COD )
    29                     SELECT SUBSTRING( @sInputString , @lPosition , @lSplitChar - @lPosition)
    30                     SET @lPosition = @lSplitChar+1
    31         END
    32     END
    33     
    34     DELETE @tbl_List WHERE RTRIM(COD)=''
    35 
    36     RETURN
    37 END

    返回结果:

    SELECT * FROM dbo.fnSPLIT('我的未来不是梦,我的心跟着希望在动',',')

    在Oracle中的代码如下:

     1 --在Type中的代码:
     2 CREATE OR REPLACE TYPE str_split IS TABLE OF VARCHAR2 (4000);
     3 
     4 --在Function中的代码:
     5 CREATE OR REPLACE FUNCTION fnSPLIT
     6 (
     7     P_InputString IN VARCHAR2, 
     8     P_Flag IN VARCHAR2
     9 )
    10     RETURN str_split 
    11     PIPELINED
    12 AS
    13     v_length   NUMBER := LENGTH(P_InputString);
    14     v_start    NUMBER := 1;
    15     v_index    NUMBER;
    16 BEGIN
    17     WHILE(v_start <= v_length)
    18     LOOP
    19         v_index := INSTR(P_InputString, P_Flag, v_start);
    20 
    21         IF v_index = 0
    22         THEN
    23             PIPE ROW(SUBSTR(P_InputString, v_start));
    24             v_start := v_length + 1;
    25         ELSE
    26             PIPE ROW(SUBSTR(P_InputString, v_start, v_index - v_start));
    27             v_start := v_index + 1;
    28         END IF;
    29     END LOOP;
    30 
    31     RETURN;
    32 END fnSPLIT;

    返回结果:

    1 select * from (select rownum rn,t.* from table(fnSPLIT('我的未来不是梦,我的心跟着希望在动',',')) t)

    将行转为列显示:

    1 select a.column_value a,b.column_value b from 
    2   (select * from (select rownum column_id,t.* from table(fnSPLIT('我的未来不是梦,我的心跟着希望在动',',')) t)) a,
    3   (select * from (select rownum column_id,t.* from table(fnSPLIT('我的未来不是梦,我的心跟着希望在动',',')) t)) b
    4 where a.column_id=1 and b.column_id=2

  • 相关阅读:
    uva 11404 Palindromic Subsequence(LCS回文串,最小字典序)
    paip.输入法编程---输入法ATIaN历史记录 v8b
    uva 10859 Placing Lampposts (树形dp)
    【设计模式】学习笔记8:命令模式
    Android自定义ProgressDialog
    (二十四)解释器模式详解
    Hadoop--两个简单的MapReduce程序
    BMP图像的灰度化---C++实现
    android 数组数据绑定到listview
    Win64 驱动内核编程-10.突破WIN7的PatchGuard
  • 原文地址:https://www.cnblogs.com/AnneHan/p/4673526.html
Copyright © 2020-2023  润新知