昨天在工作面试环节中有人问我这个问题,对此我一无所知。假设我有一个单词“ Manhattan”,我只想显示字母“ M”,“ A”,“ N”,“ H”,“ T”
在SQL中。怎么做?
任何帮助表示赞赏。
最佳答案
好吧,这是我的解决方案(sqlfiddle)-它旨在使用“关系SQL”操作,这在概念上可能是面试官想要的。
完成的大多数工作只是简单地将字符串转换为一组(正,字母)记录,因为相关的最终应用DQL仅仅是应用了分组和排序的SELECT。
select letter
from (
-- All of this just to get a set of (pos, letter)
select ns.n as pos, substring(ss.s, ns.n, 1) as letter
from (select 'MANHATTAN' as s) as ss
cross join (
-- Or use another form to create a "numbers table"
select n from (values (1),(2),(3),(4),(5),(6),(7),(8),(9)) as X(n)
) as ns
) as pairs
group by letter -- guarantees distinctness
order by min(pos) -- ensure output is ordered MANHT
上面的查询在SQL Server 2008中有效,但是对于其他供应商,可能必须更改"Numbers Table"。否则,将没有使用任何特定于供应商的东西-没有CTE,没有功能的交叉应用,也没有程序语言代码。
话虽这么说,但以上只是展示一种概念上的方法-SQL设计用于记录的集合和关系以及多重性;从某种意义上讲,以上示例仅是这种情况的变形。
检查中间关系,
select ns.n as pos, substring(ss.s, ns.n, 1) as letter
from (select 'MANHATTAN' as s) as ss
cross join (
select n from (values (1),(2),(3),(4),(5),(6),(7),(8),(9)) as X(n)
) as ns
使用cross join生成字符串(1行)与数字(9行)的笛卡尔乘积;然后对
substring
函数应用字符串和每个数字,以根据其位置获取每个字符。结果集包含以下记录:POS LETTER
1 M
2 A
3 N
..
9 N
然后,外部选择器根据字母对每个记录进行分组,并根据建立分组的字母的最小(第一个)出现位置对结果记录进行排序。 (没有字母的顺序会有所不同,但不能保证最终的顺序。)
关于sql - 如何在SQL中拆分和显示单词的不同字母?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23841293/