一尘不染

在选定字符就位后选择性地动态获取子字符串的函数

sql

在其中一个数据库表中,我有一个nvarchar类型字段,其中包含一系列特殊字符串和一些特殊字符。例如:

'HGHGSD_JHJSD_HGSDHGJD_GFSDGFSHDGF_GFSD'

或者

'SJDGh-SUDYSUI-jhsdhsj-YTsagh-ytetyyuwte-sagd'

或者

'hwerweyri~sdjhfkjhsdkjfhds~jsdfhjsdhf~mdnfsd,mfn'

基于公式,在特殊字符之后总是返回一个子字符串。但是这个字符串可能在特殊字符的第一个、第二个或第三个位置or-之后。我在 SQL Server 中使用和运行。但总是只返回所选字符之后的字符串的第一部分。例如:_``~``Charindex``Substring

select SUBSTRING ('hwerweyri~sdjhfkjhsdkjfhds~jsdfhjsdhf~mdnfsd,mfn', 0, CHARINDEX('~', 'hwerweyri~sdjhfkjhsdkjfhds~jsdfhjsdhf~mdnfsd,mfn', 0))

返回值: hwerweyri 如果有针对这个目的的解决方案或者你有一段代码可以解决这个问题,请指教。需要说明的是,特殊字符的位置必须自己在函数中输入,例如在第三次重复或第二次重复或第十次重复之后。方法或代码应该可以动态输入位置,并且不需要静态定义函数。例如:

'HGHGSD_JHJSD_HGSDHGJD_GFSDGFSHDGF_GFSD' ==> 3rd substring ==> 'GFSDGFSHDGF'
'HGHGSD_JHJSD_HGSDHGJD_GFSDGFSHDGF_GFSD' ==> second substring ==> 'HGSDHGJD'
'HGHGSD_JHJSD_HGSDHGJD_GFSDGFSHDGF_GFSD' ==> 1st substring ==> 'JHJSD'

并且公式会通过编程的形式发送给函数,生成的数字将是1到15之间的数字。这些数字实际上是一个产品的生产效率,其形式是用C#编程语言设计的。发送到函数的这些数字是可变的,并且每次这些数字都可以发送到函数并应用于所需的字符串。输出应该类似于上面的输出。我不知道我是否成功地表达了我的观点,或者我是否成功地提出了我的要求。


阅读 82

收藏
2022-07-21

共1个答案

一尘不染

尝试以下功能:

CREATE FUNCTION [dbo].[SplitWithCte]
(
    @String NVARCHAR(4000),
    @Delimiter NCHAR(1),
    @PlaceOfDelimiter int
)
RETURNS Table
AS 
RETURN
(
WITH SplitedStrings(Ends,Endsp)
    AS (
        SELECT 0 AS Ends, CHARINDEX(@Delimiter,@String) AS Endsp
        UNION ALL
        SELECT Endsp+1, CHARINDEX(@Delimiter,@String,Endsp+1)
            FROM SplitedStrings
            WHERE Endsp > 0
    )
    SELECT f.DataStr
    FROM (
        SELECT 'RowId' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
        'DataStr' = SUBSTRING(@String,Ends,COALESCE(NULLIF(Endsp,0),LEN(@String)+1)-Ends)
        FROM SplitedStrings
    ) f WHERE f.RowId = @PlaceOfDelimiter + 1
)

如何使用:

select * from [dbo].[SplitWithCte](N'HGHGSD_JHJSD_HGSDHGJD_GFSDGFSHDGF_GFSD', N'_', 3)

或者

select DataStr from [dbo].[SplitWithCte](N'HGHGSD_JHJSD_HGSDHGJD_GFSDGFSHDGF_GFSD', N'_', 3)

结果: GFSDGFSHDGF

2022-07-21