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

标签 sql

昨天在工作面试环节中有人问我这个问题,对此我一无所知。假设我有一个单词“ 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/

相关文章:

sql - Microsoft 主数据服务 - 何时使用?

mysql - 需要正确的数据库结构以减小大小

mysql - 当外键不同时,如何将主键连接到 MySQL 中的两个外键?

sql - 在 postgresql 上将默认值设置为 null

MySQL 查询 - 条件(比较字符串)不起作用

java - 如何在 MySQL 中创建临时过程?

C# SQL 命令变量与文字

sql - 如何在 postgresql 中调试 "division by zero"错误

sql - 获取计数行的最后一个实例

mysql - 返回仅拥有汽车、摩托车或汽车和摩托车的人员列表