当前位置: 代码迷 >> Sql Server >> 暴难的字符串拼接有关问题(不可以用临时表 及 游标)
  详细解决方案

暴难的字符串拼接有关问题(不可以用临时表 及 游标)

热度:420   发布时间:2016-04-27 19:09:02.0
暴难的字符串拼接问题(不可以用临时表 及 游标)
现在有表:

FieldValue             ConcatenationOrder  
-------------------------  
TH                             NULL
LF                             NULL
1N4148-TAP             NULL
1                                   1
VF                                 1
0.3                               2
A                                   2
80                                 4
VBR                               4
DO35                           NULL

****************************************************************
需要拼接字符串结果如下:
------------------------------------------------
TH,LF,1N4148-TAP,1VF,0.3A,80VBR,DO35

****************************************************************
规则:
如果ConcatenationOrder字段为NULL,用逗号(,)格开,如果不为null,字符直接连接,但不同的ConcatenationOrder字段,其FieldValue需用逗号(,)格开。
不可以用临时表,不可以用游标。其他应该都可以使用。

****************************************************************
现在有一个比较接近的语句可以参考,或者推翻重新写也可以。

declare   @str   varchar(8000)  
set   @str= ' '  
select   @[email protected]+ ', '   +cast(FieldValue   as   varchar)   from  
(
select   *   from   testtable
)   x
set   @str=right(@str,len(@str)-1)  
select   @str

****************************************************************
表结构数据提供:
if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N '[TestTable] ')   and   OBJECTPROPERTY(id,   N 'IsUserTable ')   =   1)
drop   table   [TestTable]
GO
create   table   TestTable(
FieldValue   varchar(80),      
ConcatenationOrder   int
)
GO

insert   into   TestTable  
select   'TH ',NULL
union   select   'LF ',   NULL
union   select   '1N4148-TAP ',NULL
union   select   '1 ',1
union   select   'VF ',1
union   select   '0.3 ',2
union   select   'A ',2
union   select   '80 ',4
union   select   'VBR ',4
union   select   'DO35 ',NULL
Go

select   *   from   testtable
GO

------解决方案--------------------

SELECT
FieldValue = REPLACE(re.value( '(/r)[1] ', 'nvarchar(max) '), N ' , ', N ' ')
FROM(
SELECT re = (
SELECT *
FROM(
SELECT FieldValue
FROM testtable
WHERE ConcatenationOrder IS NULL
UNION ALL
SELECT
FieldValue = REPLACE(B.FieldValue.value( '(/r)[1] ', 'nvarchar(max) '), N ' ', N ' ')
  相关解决方案