您可以从SQL中的同一表行中选择多个值吗?

时间:2013-08-27 21:47:52

标签: sql sql-server

我在一个SQL表中工作,其中一串信息存储在每个高级对象的单个列/行中。此列存储有关它们包含的基础对象的信息,每个子对象由[Report] Report1 .... [Report] Report2 ...等标记表示。有很多底层对象和标签,我需要能够在[Report]标签之后仅提取值。

表格结构

|的ObjectID | ObjectText |

| 1 | [报告]报告1 [日期] 1 [报告]报告2 [日期] 2 [报告]报告3 [日期] 2 |
| 2 | [报告]报告5 [日期] 1 [报告]报告8 [日期] 2 [报告]报告3 [日期] 2 |
| 3 | [报告] report1 [date] 1 [Report] report2 [date] 2 [Report] report2 [date] 2 |


我不知道如何做到这一点,虽然我可以使用CharIndex()和substring()来接收第一个[Report]标签及其后面的值,但我不知道如何从中获取所有值每一行。

选择子串(ObjectText,Charindex('[Report]',ObjectText),15)作为报告 来自ObjectTable

我无法控制数据在表中的存储方式,我个人不会在同一行存储这么长的无关信息。

2 个答案:

答案 0 :(得分:0)

关于将数据拆分为数组,请放下,SQL Server的最佳信息来源之一:

http://www.sommarskog.se/arrays-in-sql.html

全面阅读。

答案 1 :(得分:0)

您可以尝试使用以下功能:

create function ftStringsBetween
(
    @str varchar(1000),
    @tagStart varchar(50),
    @tagEnd varchar(50)
)
returns table as
return
    with [10](N) as (select 1 union all select 1 union all select 1 union all select 1 union all select 1
        union all select 1 union all select 1 union all select 1 union all select 1 union all select 1),
    [1000](N) as (select 1 from [10] a, [10] b, [10] c),
    v3(N) as (select top (isnull(datalength(@str), 0)) row_number() over (order by @@spid) from [1000]),
    v4(N) as (select N + datalength(@tagStart) from v3 where charindex(@tagStart, @str, N) = N),
    v5(N1, N2) as (select N, N2=isnull(nullif(charindex(@tagEnd, @str, N), 0), datalength(@str) + 1) from v4)
    select Value = substring(@str, N1, N2-N1)
    from v5
GO

您可以将其应用于您的数据:

select o.ObjectID, rtrim(ltrim(fsb.Value)) Report
from Objects o
    outer apply ftStringsBetween(o.ObjectText, '[Report]', '[') fsb

它将导致:

ObjectID    Report
----------- -----------
1           report1
1           report2
1           report3
2           report5
2           report8
2           report3
3           report1
3           report2
3           report2

SQLFiddle sample