SQL Select Distinct但包含分隔值

Emm*_*mma 2 sql sql-server asp-classic sql-server-2008

来自表车辆的示例数据

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
Run Code Online (Sandbox Code Playgroud)

我需要一个Select Distinct语句,它会将以下结果带入查询中,因此我们选择所有唯一值,但也要分割; 同样.

BODY TYPE
AAA
BBB
CCC
DDD
EEE
FFF
GGG
Run Code Online (Sandbox Code Playgroud)

我已经查看了包含各种函数的类似问题,但我希望结果可以作为查询查看.我已经尝试将下面的建议调整到我的方案中

Dev*_*art 5

试试这个 -

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)
Run Code Online (Sandbox Code Playgroud)

输出 -

----------
AAA
BBB
CCC
DDD
EEE
FFF
GGG
Run Code Online (Sandbox Code Playgroud)

  • @ EmmaLees-Smith的`@ temp`表是你的车辆表.这只是一个例子 (2认同)

pod*_*ska 5

您应该以规范化的形式存储数据.那说,试试这个

;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
Run Code Online (Sandbox Code Playgroud)