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

将列中的文本标准化为表格的最有效方法是什么?

荀金鹏
2023-03-14
问题内容

在T-SQL中,我有一列包含一些文本,其格式如下:

[Key1:Value1:Value2:Value3:Value4:Value5]
[Key2:Value1:Value2:Value3:Value4:Value5]
[Key3:Value1:Value2:Value3:Value4:Value5]

其中可以有任意数量的括号集,但通常在3到6之间。我正在寻找一种将它们快速格式化为临时表或表变量的方法,以便可以报告数据。例如,我希望表格式为:

|Key|Column 1|Column 2|Column 3|Column 4|Column 5|  
|Key 1|Value 1|Value 2|Value 3|Value 4|Value 5|  
|Key 2|Value 1|Value 2|Value 3|Value 4|Value 5|  
|Key 3|Value 1|Value 2|Value 3|Value 4|Value 5|

我知道这正在推动SQL的发展,应该通过修改应用程序来解决,但我希望T-SQL现在可以做些聪明的事情。


问题答案:

如果您具有最大的列数,则在CROSS APPLY中使用一些XML。

如果未知,则必须进行动态处理。

例子

Declare @YourTable Table ([ID] varchar(50),[SomeCol] varchar(50))
Insert Into @YourTable Values 
 (1,'[Key1:Value1:Value2:Value3:Value4:Value5]')
,(2,'[Key2:Value1:Value2:Value3:Value4:Value5]')
,(3,'[Key3:Value1:Value2:Value3:Value4:Value5]')

Select A.ID
      ,B.*
 From  @YourTable A
 Cross Apply (
                Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
                      ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
                      ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
                      ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
                      ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
                      ,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
                      ,Pos7 = ltrim(rtrim(xDim.value('/x[7]','varchar(max)')))
                      ,Pos8 = ltrim(rtrim(xDim.value('/x[8]','varchar(max)')))
                      ,Pos9 = ltrim(rtrim(xDim.value('/x[9]','varchar(max)')))
                From  (Select Cast('<x>' + replace(replace(replace(SomeCol,'[',''),']',''),':','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B

退货

ID  Pos1    Pos2    Pos3    Pos4    Pos5    Pos6    Pos7    Pos8    Pos9
1   Key1    Value1  Value2  Value3  Value4  Value5  NULL    NULL    NULL
2   Key2    Value1  Value2  Value3  Value4  Value5  NULL    NULL    NULL
3   Key3    Value1  Value2  Value3  Value4  Value5  NULL    NULL    NULL

编辑

我应该添加,这ltrim(rtrim(...))是可选的,而这varchar(max)是我的示范默认值。

编辑-以CRLF分隔的一个字符串

Declare @S varchar(max)='
[Key1:Value1:Value2:Value3:Value4:Value5]
[Key2:Value1:Value2:Value3:Value4:Value5]
[Key3:Value1:Value2:Value3:Value4:Value5]
'

Select B.*
 From  (
        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(@S,char(13)+char(10),'</x><x>')+'</x>' as xml).query('.')) as A 
        Cross Apply x.nodes('x') AS B(i)
       ) A
 Cross Apply (
               Select  Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
                      ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
                      ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
                      ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
                      ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
                      ,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
                      ,Pos7 = ltrim(rtrim(xDim.value('/x[7]','varchar(max)')))
                      ,Pos8 = ltrim(rtrim(xDim.value('/x[8]','varchar(max)')))
                      ,Pos9 = ltrim(rtrim(xDim.value('/x[9]','varchar(max)')))
                From  (Select Cast('<x>' + replace(replace(replace(RetVal,'[',''),']',''),':','</x><x>')+'</x>' as xml) as xDim) as A 
       ) B
 Where A.RetVal is not null


 类似资料:
  • 问题内容: 说我有: 现在,我要将int值转换为String。哪种方法更有效? 我只是好奇是否有真正的区别,或者一个比另一个更好? 问题答案: 测试了10m分配的数字10 一个似乎赢了 编辑:JVM是Mac OS X 10.5下的标准’/ usr / bin / java’ 更多编辑: 要求的代码 情况2和3同样 使用

  • 问题内容: 在Python中将list with转换为list with的最简单方法是什么?例如,我们必须转换为。当然,我们可以使用循环,但这太简单了。 问题答案: Python 2.x: Python 3.x(在3.x中,返回迭代器,而不是在2.x中的列表): 资料:2.6,3.1

  • 问题内容: 目前,我的代码中有很多类似于以下内容的python对象: 现在,我想将其转换为Django模型,其中self.myName是字符串字段,而self.myFriends是字符串列表。 由于列表是python中如此常见的数据结构,因此,我希望其中有一个Django模型字段。我知道我可以使用ManyToMany或OneToMany关系,但是我希望避免代码中的额外间接访问。 问题答案: 将这种

  • 问题内容: 我有一个包含嵌套列表的列表,我需要知道在这些嵌套列表中搜索的最有效方法。 例如,如果我有 并且我必须搜索上面的整个列表,找到“ d”的最有效方法是什么? 问题答案: 使用列表推导,给出: 产量: 这也可以使用生成器来完成(如@AshwiniChaudhary所示) 根据以下评论进行更新: 这是相同的列表理解,但是使用了更具描述性的变量名: 列表理解部分中的循环构造等效于 并生成一个列表

  • 我需要从Python 2.7中的对象列表中删除前n个元素。有没有一种不使用循环的简单方法?

  • 嗯,任何人都可以说这个问题已经被问到并回答了。不要紧,我也找到他们了。 JAX-RS:如何在返回响应对象时自动序列化集合? 通过GenericEntity在RESTful响应对象中使用Java-generics模板类型 我对使用响应的方式并不感到困惑,只是对可移植性不太相信。 据了解,GlassFish和WileFly工作。 和JSON(我认为它可能因提供者而异) 有时,当容器找不到时,我会发现一