基于代码模式操作字符串的 SQL 算法

标签 sql sql-server sql-server-2008

我的Sql代码如下,

Declare @text nvarchar(max) = 'America,Japan,Indonesia,London'
Declare @Pattern nvarchar(20) = '1001'

因此,对于此模式,sql 函数应将字符串返回为 'America,London' 应根据模式对字符串进行操作,如果模式字符为 0,则应删除相应的逗号分隔文本。

预期示例输出:

@Pattern           @Text
1100               'America,Japan'
1000               'America'
0100               'Japan'
1111               'America,Japan,Indonesia,London'

在 SQL Server 2008 中实现此结果的有效方法是什么

最佳答案

借助解析/分割函数

Declare @text nvarchar(max) = 'America,Japan,Indonesia,London'
Declare @Pattern nvarchar(20) = '1001'

Select NewString = Stuff((Select  ',' +RetVal 
  From (Select A.RetSeq,A.RetVal 
         From (Select * from [dbo].[udf-Str-Parse](@Text,',')) A
         Join (Select * from [dbo].[udf-Str-Parse](Stuff(Replace(Replace(@Pattern,'0',',0'),'1',',1'),1,1,''),',')) B
           on (A.RetSeq=B.RetSeq and B.RetVal=1)
     ) A
  For XML Path ('')),1,1,'') 

返回

NewString
America,London

UDF(如果需要)

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10))
Returns Table 
As
Return (  
    Select RetSeq = Row_Number() over (Order By (Select null))
          ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
    From (Select x = Cast('<x>'+ Replace(@String,@Delimiter,'</x><x>')+'</x>' as xml).query('.')) as A 
    Cross Apply x.nodes('x') AS B(i)
);
--Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',')
--Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ')

关于基于代码模式操作字符串的 SQL 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40157537/

相关文章:

sql-server - 如何显示 fsharp.data.sqlprovider 类型提供程序生成的 SQL

sql - 以编程方式将 XML 数据导入 MS SQL 服务器

c# - 创建分组中继器布局

sql-server - 如何检查数据库是否存在?

sql-server - 获取年份中的季度开始日期和结束日期

MySQL 在 SELECT 中引用嵌套查询结果?

sql - 在 nvarchar 声明中省略 size 有什么影响

sql - Insert 语句中的多个 Select 语句出错

sql - 如何在 postgres 中强制执行单向唯一性?

SQL Server 乐观锁定 - 返回更改的时间戳值