加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

如何在SQL中分离和显示单词中的不同字母?

发布时间:2020-12-12 16:34:19 所属栏目:MsSql教程 来源:网络整理
导读:昨天在工作面试中我被问到这个问题,我没有任何线索.假设我有一个字“曼哈顿”我只想显示字母’M’,’A’,’N’,’H’,’T’ 在SQL中.怎么做? 任何帮助是赞赏. 解决方法 那么这里是我的解决方案( sqlfiddle) – 它的目的是使用一个“关系SQL”操作,这可能是面
昨天在工作面试中我被问到这个问题,我没有任何线索.假设我有一个字“曼哈顿”我只想显示字母’M’,’A’,’N’,’H’,’T’
在SQL中.怎么做?
任何帮助是赞赏.

解决方法

那么这里是我的解决方案( sqlfiddle) – 它的目的是使用一个“关系SQL”操作,这可能是面试官在概念上所做的.

所做的大部分工作只是将字符串转换成一组(pos,letter)记录,因为相关的最终应用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,1) as letter
  from (select 'MANHATTAN' as s) as ss
  cross join (
    select n from (values (1),(9)) as X(n)
    ) as ns

使用cross join生成带有数字(9行)的字符串(1行)的笛卡尔乘积;然后使用字符串和每个数字应用子字符串函数,以根据其位置获取每个字符.结果集包含记录 –

POS LETTER
1   M
2   A
3   N
..
9   N

然后,外部选择根据字母对每个记录进行分组,并且生成的记录按照建立分组的字母的最小(第一)出现位置排序. (没有信件的顺序将是不同的,但最终的订单将不会得到保证.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读