作为数据清理练习的一部分,我需要提供在几个名称字段中使用的唯一字符列表。因此,例如,假设我有一个 person 表,其中有两列名为 first_name 和 last_name,只有一行,如下所示:
first_name last_name
Elizabeth Smith
我希望能够产生以下结果:
letter
a
b
e
E
h
i
l
m
S
t
z
我认为递归公用表表达式是要走的路。
作为数据清理练习的一部分,我需要提供在几个名称字段中使用的唯一字符列表。因此,例如,假设我有一个 person 表,其中有两列名为 first_name 和 last_name,只有一行,如下所示:
first_name last_name
Elizabeth Smith
我希望能够产生以下结果:
letter
a
b
e
E
h
i
l
m
S
t
z
我认为递归公用表表达式是要走的路。
试试这个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
一种可能的方法:创建一个字母表并使用 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 <> ' '