0

我在 SQL 表中有以下形式的列 (varchar400):

Info
UserID=1123456,ItemID=6685642

该列是通过我们的销售点应用程序创建的,因此我不能做简单的将它分成两列的正常事情,因为这会导致大量的工作。我的问题是这个列用于存储我们数据库中产品的属性,所以虽然我只关心 UserID 和 ItemID,但这里可能存储了多余的信息,例如:

   Info
   IrrelevantID=666,UserID=123124,AnotherIrrelevantID=1232342,ItemID=1213124.

我要检索的只是两列,如果列中都不存在这些属性,则不会给出错误Info。:

UserID ItemID
123124 1213124

考虑到 ID 的长度都是可变的,但所有属性都以逗号分隔并遵循统一的样式(即“UserID=number”),是否有可能通过错误检查有效地做到这一点。

谁能告诉我处理我的问题的最佳方法?

非常感谢。

4

3 回答 3

1

你可以试试这个拆分功能: http: //www.sommarskog.se/arrays-in-sql-2005.html

于 2013-06-25T16:42:41.560 回答
1

尝试这个

declare @infotable table (info varchar(4000))
insert into @infotable
select 'IrrelevantID=666,UserID=123124,AnotherIrrelevantID=1232342,ItemID=1213124.'
union all 
select 'UserID=1123456,ItemID=6685642'

-- convert info column to xml type
; with cte as
(
    select cast('<info ' + REPLACE(REPLACE(REPLACE(info,',', '" '),'=','="'),'.','') + '" />' as XML) info,
    ROW_NUMBER() over (order by info) id
    from @infotable
)
select userId, ItemId from 
(

       select T.N.value('local-name(.)', 'varchar(max)') as Name,
       T.N.value('.', 'varchar(max)') as Value, id
       from cte cross apply info.nodes('//@*') as T(N)
) v
pivot (max(value) for Name in ([UserID], [ItemId])) p

SQL 演示

于 2013-06-25T16:55:38.817 回答
0

假设 ItemID=1213124。以点终止。

Declare @t Table (a varchar(400))
insert into @t values ('IrrelevantID=666,UserID=123124,AnotherIrrelevantID=1232342,ItemID=1213124.')
insert into @t values ('IrrelevantID=333,UserID=222222,AnotherIrrelevantID=0,ItemID=111.')

Select 
STUFF(
Stuff(a,1,CHARINDEX(',UserID=',a) + Len(',UserID=')-1 ,'' )
,CharIndex
(',',
Stuff(a,1,CHARINDEX(',UserID=',a) + Len(',UserID=')-1 ,'' )
) 
,400,'') as UserID

,
STUFF(
Stuff(a,1,CHARINDEX(',ItemID=',a) + Len(',ItemID=')-1 ,'' )
,CharIndex
('.',
Stuff(a,1,CHARINDEX(',ItemID=',a) + Len(',ItemID=')-1,'' )
) 
,400,'') as ItemID
from @t
于 2013-06-25T16:50:36.037 回答