SQL选择不同但包含分隔的值

SQL选择不同但包含分隔的值,sql,sql-server,sql-server-2008,asp-classic,Sql,Sql Server,Sql Server 2008,Asp Classic,来自表Vehicle的示例数据 ID BODY TYPE Litre 1 AAA 1.5 2 BBB; CCC 1.9 3 DDD 1.9 4 EEE; FFF; GGG 1.8 5 GGG 1.8 我需要一个Select Distinct语句,该语句将把以下结果带到查询中,这样我们就可以选择所有唯一的值,但也可以按进行拆分

来自表Vehicle的示例数据

ID     BODY TYPE        Litre
1      AAA              1.5
2      BBB; CCC         1.9
3      DDD              1.9
4      EEE; FFF; GGG    1.8
5      GGG              1.8
我需要一个Select Distinct语句,该语句将把以下结果带到查询中,这样我们就可以选择所有唯一的值,但也可以按进行拆分;还有

BODY TYPE
AAA
BBB
CCC
DDD
EEE
FFF
GGG
我已经研究过包含各种函数的类似问题,但我希望结果可以作为查询查看。我已尝试根据我的情景调整以下建议

试试这个-

DECLARE @temp TABLE (string VARCHAR(50))

INSERT INTO @temp (string)
VALUES 
('AAA'),          
('BBB; CCC'),     
('DDD'),           
('EEE; FFF; GGG'), 
('GGG')    

SELECT DISTINCT LTRIM(t.c.value('.', 'VARCHAR(10)'))
FROM (
    SELECT ID = CAST ('<t>' + REPLACE(string, ';', '</t><t>') + '</t>' AS XML)
    FROM @temp
) r 
CROSS APPLY ID.nodes ('/t') t(c)

您应该以标准化的形式存储数据。也就是说,试试这个

;with c as (
    select bodytype, 0 as start, CHARINDEX(';', bodytype) as sep 
    from Vehicle
    where litre=1.9 
    union all
    select bodytype, sep, CHARINDEX(';', bodytype, sep+1) from c
    where sep>0

)
    select distinct LTRIM(RTRIM(SUBSTRING(bodytype,start+1,chars))) as [BodyType]
    from
    (
        select *, Case sep when 0 then LEN(bodytype) else sep-start-1 end as chars
        from c
    ) v

我不懂这个密码。t.c.值是多少?为什么这里有一个句号?我不想创建任何单独的表,我只需要一个简单的select语句,我可以在我的ASP页面上使用。这只是从数据库中提取的数据-有1000行,我不明白我们为什么要将它们插入@temp表中,以及如何使用1000行来完成这些操作。@EmmaLees Smith
@temp
表是您的车辆表。这只是一个例子example@devart虽然这看起来更整洁,但即使是在小样本上,它的性能似乎也比CTE差得多。想法?@podiluska如果我没有混淆任何东西的话,使用
XML
的功能不是
sqlserver
固有的,而是从外部库加载的。这就是为什么使用XML处理大量数据不如使用CTE处理大量数据有效的原因。对我来说,只有在我确信没有太多数据的情况下,我才会使用
XML
。如果你能帮助的话,你真的不应该这样存储数据。这是一个固定的车辆索引-相信我,如果这是我的选择,我不会这么做,但不幸的是,它需要这样:)这看起来更有希望,我想我仍然可以在这里添加where by子句?例如,where L=1.9谢谢,到目前为止在SQL server中看起来不错-只希望它现在可以从ASP页面工作结果显示没有列名-如果我想在ASP中写回结果,我通常会写response.write recordset2.fields(“Body Type”)或类似的内容,我们需要列名吗?或者我在响应中使用什么
;with c as (
    select bodytype, 0 as start, CHARINDEX(';', bodytype) as sep 
    from Vehicle
    where litre=1.9 
    union all
    select bodytype, sep, CHARINDEX(';', bodytype, sep+1) from c
    where sep>0

)
    select distinct LTRIM(RTRIM(SUBSTRING(bodytype,start+1,chars))) as [BodyType]
    from
    (
        select *, Case sep when 0 then LEN(bodytype) else sep-start-1 end as chars
        from c
    ) v