zoukankan      html  css  js  c++  java
  • sql 自定义split

    以下数据库操作针对sql server.

    问题来源:由于项目中,有的表字段内容是由多个id或多个其他内容拼接而成.(如:'1,2,3,4,5',或者'name_age_school'),特点是都用某个分隔符储存.

    要取得其中的某部分数据内容或者验证某个数据是否在其中.

    方案一 是将数据读取到程序中,然后用程序去操作数据,将数据分割为数组,然后进行操作.最好将分割操作放到一个公用的函数库中.

    方案二:由于我遇到的问题是将其中的 "name" 替换为 "name_age_shcool"中的名字,这两个名字不一致且以后者中的为准. 因此实际意义并没有多大用途.但是客户需求,如果按照方案一的操作,我又将改动后端实现部分.且接口一要修改.

    于是在DB中完成这个字符内容的截取的想法产生了.

    解决方式:

    USE [StudentDB]
    GO
    /****** Object: UserDefinedFunction [dbo].[splitSTR] Script Date: 2016/11/24 16:05:03 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    create FUNCTION [dbo].[splitSTR](
    @s varchar(5000), --待分拆的字符串
    @split varchar(10) --分隔符
    )RETURNS @result TABLE(id int ,content varchar(100))
    AS
    BEGIN
    DECLARE @splitlen int
    DECLARE @id int
    SET @splitlen=LEN(@split+'a')-2
    SET @id=1
    WHILE CHARINDEX(@split,@s)>0
    BEGIN
    INSERT @result VALUES(@id,LEFT(@s,CHARINDEX(@split,@s)-1))
    SET @id=@id+1
    SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')
    END
    INSERT @result VALUES(@id,@s)
    RETURN
    END

    思路:每遇到一个分隔符,则将前面的字符插入到@result table中,增加id,然后将已插入的字符和分隔符截掉,并且将剩下的字符再次进行查找分隔符,插入@result table 中,增加id, 循环操作.

    只到 @s中不包含  @split 分隔符,则说明已经是最后一个字符.所以此时 直接 插入@result table 中 增加id.

    结果如图:

    变形 取特定位置的某个字符==============================================================================================================

    Create FUNCTION [dbo].[splitSTR](
    @s varchar(8000), --待分拆的字符串
    @split varchar(10), --数据分隔符
    @num int --目标数据
    )RETURNS varchar(100)
    AS
    BEGIN
    declare @des varchar(100)
    DECLARE @splitlen int
    declare @position int
    set @position=1
    SET @splitlen=LEN(@split+'a')-2
    WHILE CHARINDEX(@split,@s)>0
    if @position<>@num
    BEGIN
    SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')
    set @position=@position+1
    END
    else
    begin
    set @s=SUBSTRING(@s,1,CHARINDEX(@split,@s)-1)
    set @des=@s
    end
    set @des=@s
    RETURN @des
    END

    思路:和上面相同,在没有只到相应位置的时候,将分隔符去掉,然后循环此操作.

    结果如图

  • 相关阅读:
    C++中的动态内存管理
    Harbor镜像仓库搭建
    nexus私服搭建
    Tekton ACK安装
    容器监控实践,从入门到放弃
    Bitwarden_搭建密码服务器
    Jenkins-部署文档
    Mysql-基本的
    Zabbix添加-钉钉故障报警
    ZABBIX-4.4 yum安装
  • 原文地址:https://www.cnblogs.com/troublelost/p/6098980.html
Copyright © 2011-2022 走看看