当前位置: 首页 > 面试题库 >

是否可以在T-SQL中比较逗号分隔的字符串而不循环?

邓翼
2023-03-14
问题内容

假设我有2个表,两个表的列都称为Brand。该值以逗号分隔,因此,例如,如果表之一具有

ACER,ASUS,HP  
AMD,NVIDIA,SONY

作为价值。然后另一个表有

HP,GIGABYTE  
MICROSOFT  
SAMSUNG,PHILIPS

作为价值。

我想比较这些表以获取所有匹配的记录,在我的示例ACER,ASUS,HPHP,GIGABYTEmatch中,因为两者都有HP。现在,我正在使用循环来实现这一点,我想知道是否有可能在单个查询语法中做到这一点。


问题答案:

您想脱离循环是正确的。

由于您在2012年,因此String_Split()不在桌面上。但是,野生中有任意数量的拆分/解析TVF函数。

示例1-没有TVF

Declare @T1 table (Brand varchar(50))
Insert Into @T1 values 
('ACER,ASUS,HP'),
('AMD,NVIDIA,SONY')

Declare @T2 table (Brand varchar(50))
Insert Into @T2 values 
('HP,GIGABYTE'),
('MICROSOFT'),
('SAMSUNG,PHILIPS')


Select Distinct
       T1_Brand = A.Brand
      ,T2_Brand = B.Brand
 From ( 
        Select Brand,B.*
         From  @T1
         Cross Apply (
                        Select RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
                        From  (Select x = Cast('<x>' + replace(Brand,',','</x><x>')+'</x>' as xml)) as A 
                        Cross Apply x.nodes('x') AS B(i)
                     ) B
      ) A
 Join ( 
        Select Brand,B.*
         From  @T2
         Cross Apply (
                        Select RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
                        From  (Select x = Cast('<x>' + replace(Brand,',','</x><x>')+'</x>' as xml)) as A 
                        Cross Apply x.nodes('x') AS B(i)
                     ) B
      ) B
 on A.RetVal=B.RetVal

示例2-使用TVF

Select Distinct
       T1_Brand = A.Brand
      ,T2_Brand = B.Brand
 From ( 
        Select Brand,B.*
         From  @T1
         Cross Apply [dbo].[tvf-Str-Parse](Brand,',') B
      ) A
 Join ( 
        Select Brand,B.*
         From  @T2
         Cross Apply [dbo].[tvf-Str-Parse](Brand,',') B
      ) B
 on A.RetVal=B.RetVal

两者都会回来

T1_Brand        T2_Brand
ACER,ASUS,HP    HP,GIGABYTE

UDF(如果有兴趣)

CREATE FUNCTION [dbo].[tvf-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((Select replace(@String,@Delimiter,'搂搂Split搂搂') as [*] For XML Path('')),'搂搂Split搂搂','</x><x>')+'</x>' as xml).query('.')) as A 
    Cross Apply x.nodes('x') AS B(i)
);
--Thanks Shnugo for making this XML safe
--Select * from [dbo].[tvf-Str-Parse]('Dog,Cat,House,Car',',')
--Select * from [dbo].[tvf-Str-Parse]('John Cappelletti was here',' ')
--Select * from [dbo].[tvf-Str-Parse]('this,is,<test>,for,< & >',',')


 类似资料:
  • 问题内容: 我已经尝试过一些试验,但还不能解决。任何帮助,将不胜感激。 我有一个像下面的表。 我正在寻找的结果是。它会删除所有重复项,并仅保留具有其关联ID的不同值。 我试图用(len(replace(@ProjectNames,’,’))来计算逗号的数量 使用http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-b

  • 问题内容: 我有一个像 我想把它分成那些字符串 如果我简单地打电话给我,那么在修剪之后我会得到不同的结果,因为在某些字符串中,例如,仍然有一个逗号。但我不想放在方括号中。有解决这个问题的优雅方法吗? 问题答案: 假设和没有嵌套和未转义。您可以使用以下方式进行拆分: 正则演示 如果逗号后面没有非圆括号和,则将匹配逗号,从而忽略和中的逗号。

  • 问题内容: 我有从.net应用程序A,B,C,D,E,F获取的字符串, 我想写一个SQL选择语句像 这在t-SQL中将不起作用,因为它使用不将值分开的一个字符串。有什么办法可以做到这一点? 问题答案: 它认为最简单的方法是动态SQL生成:

  • 问题内容: 我有一个带有两个表的SQL Server 2005数据库:Order,LineItem。每个LineItem都有一个名为LineItemID和OrderID的字段。我有一个查询正在获取数据库中的所有“订单”记录。对于每个Order记录,我想检索一个以逗号分隔的与Order关联的LineItemID列表。 有没有办法在SQL中做到这一点?我不知道该怎么做。 谢谢! 问题答案: 这是一个使

  • 问题内容: 我正在使用SQL Server,我已经成功地将表的行转换为逗号分隔的值,现在我想将该字符串的逗号分隔值转换回表的行。 我有这个字串() 我希望这些值成行。 喜欢 问题答案: 创建一个函数: 将字符串和定界符(,)传递给函数。 它将结果返回为表格: 请参见 SQL Fiddle

  • 问题内容: 我想以逗号分隔Python多行字符串,除非逗号在方括号内。例如,字符串 应该分成 这涉及到括号匹配,因此正则表达式可能在这里没有帮助。PyParsing有这 几乎 做什么我需要的,只是 引用 ()环境得到保护,而不是-delimited的。 有什么提示吗? 问题答案: 编写自己的自定义拆分功能: