如何从表中的一个或多个列中提取唯一的字符列表

时间:2013-03-13 14:07:13

标签: sql sql-server

作为数据清理练习的一部分,我需要提供一些在两个名称字段中使用的唯一字符列表。例如,假设我有一个包含两列的person表,名为first_name,last_name只有一行,如下所示:

first_name last_name 
Elizabeth  Smith

我希望能够产生以下结果:

letter
a
b
e
E
h
i
l
m
S
t
z

我在想一个递归的公用表表达式。

2 个答案:

答案 0 :(得分:1)

试试这个SQL-Server 2005+

declare @tbl table (v1 varchar(100), v2 varchar(100))

insert into @tbl values ('asd','ssft'),(null,'la')

;with cte
as
(SELECT isnull(t.v1,'')+ISNULL(t.v2,'') as V, 1 as i, SUBSTRING(isnull(t.v1,'')+ISNULL(t.v2,''),1,1) Vi
FROM @tbl t
UNION ALL
SELECT V, CTE.i+1, SUBSTRING(V,i+1,1)
FROM cte
WHERE LEN(CTE.v)>=CTE.i+1
)
SELECT DISTINCT Vi --COLLATE Latin1_General_CS_AS
FROM cte
ORDER BY Vi --COLLATE Latin1_General_CS_AS

此外,如果您希望在结果集中显示大写和小写字母,则可能需要使用COLLATE Latin1_General_CS_AS(在代码中注释)指定CASE敏感collation

答案 1 :(得分:1)

一种可能的方法:使用CHARINDEX()创建一个字母表并将其挂钩到名称,然后返回匹配。

with letters (letter) as (

select TOp 253 CHAR(ROW_NUMBER() OVER (ORDER BY (SELECT 1)) )
 from 
 master.dbo.spt_values t1 CROSS JOIN master.dbo.spt_values t2 
order by
 ROW_NUMBER() OVER (ORDER BY (SELECT 1))
),

name (name) as (

select  'Elizabeth Smith' COLLATE Latin1_General_CS_AS as name 
)

select  letters.* from 
letters
inner join name on charindex(letter,  name) > 0 
and letter <> ' '