标记列

时间:2014-07-29 00:23:23

标签: sql-server sql-server-2008-r2

我有一个订单表,其中包含由空格分隔的订单详细信息 - 订单详细信息可能包含多个项目(是的,我知道这会破坏数据库约定,但它是我们的第三方数据库之一)。我已经能够提取它,但解决方案不是很优雅。不确定你们有没有更好的解决方案?

实施例: 详细信息列 [订单类型] [数量] [项目] [其他信息] [订单类型] [数量] [项目] [其他信息] ......

因此每列可能包含多个订单商品

1 个答案:

答案 0 :(得分:0)

这可以通过修改现有的字符串分割器函数之一来实现,这样它不仅可以返回单词,还可以返回原始字符串中的数字。然后你必须寻找单词' Buy'和'销售',得到他们的数字,接下来的两个单词分别是数量和项目。

<强>查询

declare @str varchar(1000)
set @str = 'Buy 1 AAA Oct 2008 Sell 1 AAA Nov 2008 Buy 3 JJJ Jan 2009'

;with words as (
    select word, wordNum
    from ftStringSplit(@str, ' ')
),
tokenNums as (
    select wordNum + 1 as wnQty, wordNum+2 wnItem
    from words
    where word in ('Buy', 'Sell')
)
select wI.word as Item, wQ.word as Qty
from tokenNums tn
    join words wI on wI.wordNum = tn.wnItem
    join words wQ on wQ.wordNum = tn.wnQty

<强>输出

| ITEM | QTY |
|------|-----|
|  AAA |   1 |
|  AAA |   1 |
|  JJJ |   3 |

参见 SQL Fiddle 示例