2

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

first_name last_name 
Elizabeth  Smith

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

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

我认为递归公用表表达式是要走的路。

4

2 回答 2

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

此外,如果您希望大写字母和小写字母都出现在结果集中,您可能需要使用(在代码中注释)指定 CASE Sensitive排序规则。COLLATE Latin1_General_CS_AS

于 2013-03-13T14:20:41.853 回答
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 <> ' '
于 2013-03-13T14:23:53.603 回答