Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于代码模式操作字符串的SQL算法_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

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

基于代码模式操作字符串的SQL算法,sql,sql-server,sql-server-2008,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,Ja

我的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',' ')

源文本是否总是恰好由四列分隔的四个名称?是否总是有四个城市?或者它可以更多?将字符串转换为xml列表,然后对其使用xml查询。或者更好的是,让前端发送xml。无需RBarry。城市可以更多。它没有固定的四个城市