精华内容
下载资源
问答
  • 想要在MS SQL中根据给定的分隔符把这个字符串分解成各个元素,本文将详细介绍此功能的实现,需要了解的朋友可以参考下
  • SqlServer中通过XML拆分字符串,需要的朋友可以参考下。
  • Oracle SQL 拆分字符串

    千次阅读 2020-05-09 18:09:50
    在 Oracle 数据库中,可以使用 instr 和 subStr 函数搭配拆分字符串

    前言

    OS: Window 10
    Oracle:Oracle 11g

    instr 函数

    instr(str, pattern) 在 str 串中找出第一次出现 pattern 串的索引位置并返回,若找不到则返回 0
    注意:索引从 1 开始

    select instr('Hello:World:Java', ':') from dual; -- 返回 6
    
    select instr('Hello:World:Java', '=') from dual; -- 返回 0
    
    

    tips: dual 是 Oracle 数据库中虚拟表,可以用该表进行 Oracle 函数的学习

    subStr 函数

    substr(str, start, len)
    说明:start 起始位置可以是 0 或 1 ,若不指定 len ,则截取到末尾位置结束

    select subStr('abc123',4) from dual; -- 123
    select subStr('abc123', 1, 3) from dual; -- abc
    select subStr('abc123', 0, 3) from dual; -- abc
    

    拆分字符串

    需求: 将字符串'Hello:World',拆分为 'Hello''World' 两部分

    select subStr('Hello:World', 1, instr('Hello:World',':') - 1) from dual; -- Hello
    select subStr('Hello:World',instr('Hello:World',':')+1) from dual; --World
    
    展开全文
  • C#中和JavaScript中都有相应的分离字符串的Split函数,就想当然的以为SQL中也会有类似的函数,结果查了半天的MSSQL帮助文档,也没找到。没办法,只好自己写了,在网上搜了下相关的,看了一两篇关于SQL分离字...

    前段时间,在做一个可以批量审核或删除数据的功能时,遇到这么个问题:

    因为审核或删除操作是在存储过程进行的,所以,就打算将选中的数据的主键拼成字符串,传到存储过程进行分离,再继续处理。

    C#中和JavaScript中都有相应的分离字符串的Split函数,就想当然的以为SQL中也会有类似的函数,结果查了半天的MSSQL帮助文档,也没找到。

    没办法,只好自己写了,在网上搜了下相关的,看了一两篇关于SQL分离字符串的自定义函数的文章,结果,有点失望,可能是自己水平差,或者是因为人家的代码没写注释吧,总之就是看着挺吃力的,还没看完就决定自己写了。。。

    思路很简单:在需要分解的字符串中,如果存在指定的分隔符,则将第一个分隔符前面的字符串取出,存入表内,然后在需要分解的字符串中将已取出的字符串及第一个分隔符删除,然后继续下一次分解(如果还存在指定的分隔符,就分解)

    以下是SQL:

    1 --=============================================2 --Author: Henson3 --Create date: 2011-04-204 --Description: 字符串分离函数5 --=============================================6 ALTERFUNCTION[dbo].[Split]7 (8 @strTextvarchar(3000),--待分离的原字符串9 @strSplitvarchar(100)--分隔符10 )11 RETURNS@tempTable12 (13 IDintIDENTITYPRIMARYKEY,14 SingleValvarchar(1000)15 )16 AS17 BEGIN18 Declare@intLenint--用来存储待分离原字符串长度19 Declare@intSplitLenint--分隔符长度20 Declare@intIndexint--用来存储分离字符串在原字符串的位置21 Declare@strValvarchar(1000)--用来存储分离出来后的字符串22 --获取原字符串的长度23 Set@intLen=LEN(RTRIM(LTRIM(@strText)))24 Set@intSplitLen=LEN(RTRIM(LTRIM(@strSplit)))25 --原字符串不为空,才继续分离26 If(@intLen>0)27 Begin28 --循环原字符串,直至原字符串被分离完毕29 WhileCHARINDEX(@strSplit,@strText)>030 Begin31 --获取分离字符串在原字符串的位置32 Set@intIndex=CHARINDEX(@strSplit,@strText)33 --获取分离出的字符串,并插入表中34 Set@strVal=RTRIM(LTRIM(LEFT(@strText,@intIndex-1)))35 if(LEN(@strVal)>0)36 Begin37 InsertInto@temp(SingleVal)values(@strVal)38 End39 --分离后,将分离出的字符串(包括分隔符)从原字符串中删除40 Set@strText=Substring(@strText,@intIndex+@intSplitLen,@intLen-@intIndex)41 --重新设置原字符串的长度42 Set@intLen=LEN(@strText)43 End44 --如果分离后的原字符串依然不为空,则也应该插入表中45 if(LEN(RTRIM(LTRIM(@strText)))>0)46 Begin47 InsertInto@temp(SingleVal)values(@strText)48 End49 End50 return51 END

    (分隔符允许是多位的)

    按一般的习惯来说,在组织多个字符串时,一般都是这种写法:strKeys += strSingleKey + ",";

    所以可能最终该字符串可能会以逗号结尾,如果组织完成后,将结尾的逗号去掉了,那就不会以逗号结尾,所以,在循环分解完成后,如果剩下的原字符串中(去除左右空格后),如果还有内容 ,则也应该存入表中。

    可能我这种写法不是最好的,也可能会有问题,如确实有需要改进的,还请指出,不胜感激!!!

    展开全文
  • SQL字符串拆分为表集合

    千次阅读 2018-06-14 09:35:12
    SELECT mso.StationGUIDFROM ( SELECT CASE WHEN allitem = '' THEN NULL ELSE allitem END AS ProjCode FROM dbo.fn_split('XYCG.007.01;XYCG.007.02;XYCG.007.06;XYCG.007.12122212', ';...


    SELECT  mso.StationGUID
    FROM    (
    SELECT  CASE WHEN allitem = '' THEN NULL ELSE allitem END AS ProjCode

    FROM dbo.fn_split('XYCG.007.01;XYCG.007.02;XYCG.007.06;XYCG.007.12122212', ';')

    ) child

    INNER JOIN p_Project parent ON child.ProjCode LIKE parent.ProjCode + '.%' OR child.ProjCode = parent.ProjCode
    INNER JOIN myStationObject mso ON (mso.TableName = '项目' AND parent.ProjGUID = mso.ObjectGUID)
    展开全文
  • 之前项目的需求:创建活动,活动可以勾选不定数量的类别Type。...1,创建自定义SQL Server函数,将字符串分割为字符数组 /****** Object: UserDefinedFunction [dbo].[splitl] Script Date: 202

    之前项目的需求:创建活动,活动可以勾选不定数量的类别Type。

    贪求进度,于是在Event表直接加了一个Type Column,用字符串数组保存类别信息。

    这样无论是新增,还是更新,DB操作起来起来都相当的便捷,美滋滋~

    直到接到了新需求:需要按照不同的类别读取活动的数据😂

    1,创建自定义SQL Server函数,将字符串分割为字符数组

    
    /****** Object:  UserDefinedFunction [dbo].[splitl]    Script Date: 2021/4/12 22:55:13 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE  FUNCTION [dbo].[splitl] (
        @String VARCHAR(MAX),
        @Delimiter VARCHAR(MAX)
    ) RETURNS @temptable TABLE (items VARCHAR(MAX)) AS
    BEGIN
        DECLARE @idx INT=1
        DECLARE @slice VARCHAR(MAX) 
        IF LEN(@String) < 1 OR LEN(ISNULL(@String,'')) = 0
            RETURN
        WHILE @idx != 0
        BEGIN
            SET @idx = CHARINDEX(@Delimiter,@String)
            IF @idx != 0
                SET @slice = LEFT(@String,@idx - 1)
            ELSE
                SET @slice = @String
            IF LEN(@slice) > 0
                INSERT INTO @temptable(items) VALUES(@slice)
            SET @String = RIGHT (@String, LEN(@String) - @idx)
            IF LEN(@String) = 0
                BREAK
        END
        RETURN
    END
    GO
    
    
    

    执行上述函数,则有如下类似的结果:

    2, 将获得的type id的数组与EventType Table关联查询

    declare @e_type_table TABLE(
    	[E_ID] [int] NULL,
    	[EFT_ID] [int] NULL,
    	[EFT_NameChi] [nvarchar](50) NULL
    );
    
    	declare @ei_id_table table( EI_ID int);
    	insert into @ei_id_table(EI_ID) select [EI_ID] from [dbo].[Event_Info]
    	declare @EI_ID as int
    	while exists(select EI_ID from @ei_id_table)
    	begin
    		select top 1 @EI_ID = EI_ID FROM @ei_id_table;
        
    		insert into @e_type_table(E_ID,EFT_ID,EFT_NameChi) 
    		(select @EI_ID as EI_ID,t.EFT_ID,t.EFT_NameChi from (select items as id from dbo.splitl((select [EI_Types] from [dbo].[Event_Info] where [EI_ID] = @EI_ID),',') ) as e
    		left join [dbo].[Event_Facility_Type] as t on e.id = t.EFT_ID) 
    
    		delete from @ei_id_table where EI_ID = @EI_ID;
    	end
    
    	select * from @e_type_table

    得到的结果如下:

     

     

    后续:

    这种方法,写入的时候简便,但读取的时候麻烦,而且效率比较低下。

    应该创建一个Link Table,将Event跟Type关联起来。写入的时候稍麻烦,但是免去了以后读取的烦心事。

    Link Table的Column大致有: ID, EventID, TypeID, Status(bit)...

    那么写入的思路就是:

    每次前端只返回勾选的Type ID的数组->

    ----用户勾选Type,但是从未建立过关联,需要新增关联

    ----用户勾选Type,然而虽然建立过关联,但是Status = false,需要变更其关联的Status为true

    ----用户取消之前的勾选,然而已经建立过关联,并且Status = true,需要变更其关联的Status为false

    展开全文
  • sql server 字符串拆分方法汇总

    千次阅读 2018-05-22 18:00:15
    https://blog.csdn.net/tastelife/article/details/7914646转载
  • 如何用 SQL语句拆分 +号连接的字符串 SQL如何实现类似Split函数功能
  • SQL字符串分割

    千次阅读 2019-04-25 22:33:53
    sql字符串分割: create Function [dbo].[fn_SplitStr] ( @SourceSql VARCHAR(max), -- 字符串 @StrSeprate VARCHAR(10) -- 用于分解的字符 ) RETURNS @temp TABLE(result VARCHAR(100)) AS BEGIN DECLARE @i ...
  • sql没有split函数,因此需要实现一个函数来实现按照特定符号对字符串进行拆分。上码: GO /****** Object: UserDefinedFunction [dbo].[SPLIT] Script Date: 2020/4/22 9:59:14 ******/ SET ANSI_NULLS ON GO ...
  • Sql Server数据库中自定义拆分字符串函数Split()
  • sqlserver字符串拆分(split)方法汇总

    千次阅读 2016-09-27 09:33:29
    sqlserver字符串拆分(split)方法汇总
  • 字符串切分功能在许多语言中都有现成的函数可以调用 现在用T-SQL的表值函数实现一下: CREATE function split ( @strList varchar(500), @deli char(1) ) returns @result table( obj varchar(500)) as begin ...
  • ALTER function [dbo].[f_split](@SourceSql varchar(8000),@StrSeprate varchar(10)) returns @temp table(F0000 int,F0001 varchar(100)) --实现split功能 的函数 GULAICHENG --date :2003-10-14 as begin ...
  • 我们在最里面的查询中做的是将字符串分解为单个字符.然后我们得到按字符分组的COUNT(),并使用RANK()来查找最大值(请注意,如果最常出现的字符存在平局,则会返回多个结果). 上面的查询返回最常出现的字符及其出现的...
  • Hello Tom Where are you What's your name I want to split the above string with new line and add to array as below : [Hello Tom,Where are you,What's your name] Is this possible in PL/SQL ? 解决方案 ...
  • 本文章收藏了大量的在sqlserver中字符串切割函数,包括了自用自定义函数或sql带带的函数来操作,有需要了解的同学可参考一下实例1循环while一个个读取代码如下复制代码ALTER FUNCTION [dbo].[Split](@Array VARCHAR...
  • --LEFT(character_expression, integer_expression)函数 从左截取字符串前integer_expression位 LEFT(character_expression, integer_expression) --例:LEFT('sadfasdfasdfasf',5) --截取'sadfasdfasdfasf'中前五位...
  • 将逗号分隔的字符串,每个都单独打印出来 declare @xt varchar(max) declare @channel varchar(32) set @xt='2437fc26c8ad442e9b48aea4f90b91b0,29c17ae6463d4072a13c14b2bbdcd589,2a7ea11fe4b14c47894714d908b...
  • sqlserver 分解数组

    2016-03-04 10:32:32
    分解数组的sqlserver的t-sql语句
  • SQLserver解析json字符串

    千次阅读 2019-08-20 16:25:12
    eg: 有一个json字符串:'{"A":"123","B":"456","C":"789"}',取出其中A、B、C对应的值 SQL语句如下 select (select StringValue from [dbo].[parseJSON](Isnull('{"A":"123","B":"456","C":"789"}','{\"A\":\"\"}...
  • SQL SERVER ParseName分隔字符串

    千次阅读 2018-08-26 21:22:42
    ParseName是一个分隔字符串的函数,根据“.”作为分隔符,快速获取分解后的部分,直接上例子: DECLARE @ip NVARCHAR(200) = '192.168.1.2'; SELECT PARSENAME(@ip, 1) AS col1, PARSENAME(@ip, 2) AS col2, ...
  • select a.CFXH , value = substring(a.BJCZDM , b.number , charindex(',' , a.BJCZDM + ',' , b.number) - b.number)  from NIS_HLZK_ZKJH_MX_JC a join master..spt_values b  ...注意:SQL server 2005不支持
  • set @str='s/e/r/r/t/f/vxc/vx/cvx/cvx/cvxc/vx/' --要分解字符串 set @splitChar='/' --分隔符 set @splitCharLen=LEN(@splitChar); set @i=charindex(@splitChar,@str) if @i>0 begin  while @i>0...
  • SqlServer中,并不直接支持字符串的正则表达式操作,一些特殊的字符串操作需求需要分多个步骤来完成。SQLServer替换第一个匹配的字符串方法。
  • SQLServer 解析JSON字符串

    千次阅读 2018-10-18 22:42:02
    --------------------------------------------------- ...----- 解析字符串表值函数 ----- --------------------------------------------------- CREATE FUNCTION [dbo].[fn_split](@p_str VARCHA...
  • SQL字符串分割成若干列

    千次阅读 2010-07-15 18:25:00
    在数据库编程中,很多朋友会碰到分割字符串的需求,一般都是分割成一列多行模式,但也有时会需要分割成多列一行的模式,下面我们来看下如何实现这种需求。 首先创建一个辅助函数,来得到生成多列的SQL语句:create ...
  • 分隔符{}操作,还有圆点等号.=来进行操作,圆点等号可以把一个比较长的字符串分解为几行进行定义,这样做是比较有好处的.2,替换字符串在PHP这门语言中,提供了一个名字叫做substr_replace()的函数,该函数的作用可以快速...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,931
精华内容 9,972
关键字:

sql分解字符串