【问题标题】:how to select rows data as single column in sql server如何在sql server中选择行数据作为单列
【发布时间】:2014-10-08 04:56:18
【问题描述】:

我在 SQL Server 中有一个表:

T_Id    Supplimentary_keywords
-------------------------------------------------------------------------------------------
1       Animal, Animals, 1, One, Single,live,living Organism
2       Animals, Animal, Two, 2,live,living Organism
3       Animals, Animal, Three, 3,live,living Organism
4       Animals, Animal, Four, 4,live,living Organism
5       Animals, Animal, 5, Five,live,living Organism
6       Group Of Animals, Small Group, Group, Groups, Small Size Group
7       Group Of Animals, Animals, Animal, Group, Groups, Grouping,live,living Organism
8       Group Of Animals, Animals, Animal, Group, Groups, Grouping,large Group,live 
9       Head, Heads
10      Neck, Necks

现在我想从Supplimentary_keywordsdistinct 中选择数据,如下所示:

Supplimentary_keywords
----------------------
Animal
Animals
1
One
Single
live
living Organism
Two
2
live
Three
3
.......

我正在使用以下代码

SELECT DISTINCT
    Split.a.value('.', 'VARCHAR(100)') Kwd
FROM   
    (SELECT 
         T_Id, 
         CAST('<M>' + Replace(Supplimentary_keywords, ',', '</M><M>')
                    + '</M>' AS XML) AS Data from KWD_Theaurus_tbl) AS A
     CROSS APPLY 
         data.nodes ('/M') AS Split(a) 

并得到错误

消息 9421,第 16 级,状态 1,第 1 行
XML解析:第1行,第11个字符,非法名称字符

如果我做错了,请帮助我如何实现或纠正我。

【问题讨论】:

  • 为了能够纠正您,您必须先向我们展示您的代码!
  • 不要将代码示例或示例数据放入 cmets - 因为您无法对其进行格式化,所以阅读它非常困难....而是:更新您的问题,编辑它以提供附加信息!谢谢。
  • @marc_s 对不起!我只是想向你展示我的代码,这就是为什么

标签: sql sql-server tsql


【解决方案1】:
create table #temp (id int,suppl varchar(1000))
insert into #temp
select 1 ,      'Animal, Animals, 1, One, Single,live,living Organism'
union all
select 2  ,     'Animals, Animal, Two, 2,live,living Organism'
union all
select 3  ,     'Animals, Animal, Three, 3,live,living Organism'
union all
select 4  ,     'Animals, Animal, Four, 4,live,living Organism'
union all
select 5  ,     'Animals, Animal, 5, Five,live,living Organism'
union all
select 6  ,     'Group Of Animals, Small Group, Group, Groups, Small Size Group'
union all
select 7  ,     'Group Of Animals, Animals, Animal, Group, Groups, Grouping,live,living Organism'
union all
select 8  ,     'Group Of Animals, Animals, Animal, Group, Groups, Grouping,large Group,live'
union all
select 9  ,     'Head, Heads'
union all
select 10  ,    'Neck, Necks'



SELECT distinct Split.a.value('.', 'VARCHAR(100)') data
           FROM   (select id,Cast ('<M>'
                                + Replace(suppl, ',', '</M><M>')
                                + '</M>' AS XML) AS Data from #temp) AS A
                  CROSS APPLY Data.nodes ('/M') AS Split(a) 

【讨论】:

  • Supplimentary_keywords 列数据中是否有特殊字符
  • 无效的特殊字符及其在 xml 中的替代品 & - &amp - &gt " - &quot ' - '
  • 是的,有些关键字就像Black &amp; White, Black&amp;white, B &amp; W,b&amp;w, B\w, Bw, Black-and-white
  • @pradeep:您的查询是否以与插入的顺序相同的顺序返回,如果 需要以相同的顺序,我们将需要使用我正在摸不着头脑的联合!
【解决方案2】:

试试这个..

SELECT distinct Split.a.value('.', 'VARCHAR(100)') data
           FROM   (select id,Cast ('<M>'
                                + replace(Replace(suppl, ',', '</M><M>'),'&','&amp;')
                                + '</M>' AS XML) AS Data from #temp) AS A
                  CROSS APPLY Data.nodes ('/M') AS Split(a) 

如果您有任何其他 spl 字符,请相应地替换它。

无效的特殊字符及其在 xml 中的替代品

& - &amp;
< - &lt;
> - &gt;
" - &quot;
' - &#39;

【讨论】:

    【解决方案3】:
       SELECT DISTINCT Split.a.value('.', 'VARCHAR(100)') AS Supplimentary_keywords
         FROM   (SELECT id,
               Cast ('<M>'
                     + Replace(Supplimentary_keywords, ',', '</M><M>')
                     + '</M>' AS XML) AS Supplimentary_keywords
        FROM   #temp) AS A
       CROSS APPLY Supplimentary_keywords.nodes ('/M') AS Split(a); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多