2

来自表 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

我查看了包含各种功能的类似问题,但我希望结果可以作为查询查看。我已经尝试根据我的情况调整以下建议

4

2 回答 2

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)

输出 -

----------
AAA
BBB
CCC
DDD
EEE
FFF
GGG
于 2013-08-15T09:01:09.143 回答
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
于 2013-08-15T09:16:57.730 回答