当前位置: 首页 > 面试题库 >

SQL:是否可以将数字(1,2,3,4')转换为字母(A,B,C,D')

丌官信厚
2023-03-14
问题内容

例如由于Dense_Rank函数调用(在MS Sql中),是否有可能获得字母(如A,B)而不是数字(1,2)?


问题答案:

试试这个:

SELECT
   Letters = Char(64 + T.Num),
   T.Col1,
   T.Col2
FROM
   dbo.YourTable T
;

请注意,当您达到27(past Z)时,事情将变得有趣而无用。

如果您想开始将字母加倍,... X, Y, Z, AA, AB, AC, AD ...那么它将变得有些棘手。这适用于所有版本的SQL
Server。这些SELECT子句只是CASE语句的替代(每个短2个字符)。

SELECT
   *,
   LetterCode =
      Coalesce((SELECT Char(65 + (N.Num - 475255) / 456976 % 26) WHERE N.Num >= 475255), '')
      + Coalesce((SELECT Char(65 + (N.Num - 18279) / 17576 % 26) WHERE N.Num >= 18279), '')
      + Coalesce((SELECT Char(65 + (N.Num - 703) / 676 % 26) WHERE N.Num >= 703), '')
      + Coalesce((SELECT Char(65 + (N.Num - 27) / 26 % 26) WHERE N.Num >= 27), '')
      + (SELECT Char(65 + (N.Num - 1) % 26))
FROM dbo.YourTable N
ORDER BY N.Num
;

在SQL Fiddle上观看现场演示

(适用于SQL 2008及更高版本的演示,请注意,我Dense_Rank()用来模拟一系列数字)

这将在Ato的范围内起作用ZZZZZ,代表1to的值12356630。上面所有疯狂的原因,而不是更简单的表达,是因为这里A并没有简单地表示0。在每个阈值之前,当序列跳转到A添加到前面的下一个字母时,实际上是一个隐藏的空白数字,但不再使用。所以5个字母长不是26
^ 5的组合,而是26 + 26 ^ 2 + 26 ^ 3 + 26 ^ 4 + 26 ^ 5!

为了使此代码正常工作,需要花点时间进行修补…希望您或有人对此感到满意!只需添加另一个具有正确值的生成字母的表达式,就可以轻松地将其扩展为更多的字母。

由于看起来我现在正处于男子气概比赛的中间,因此我进行了一些性能测试。一WHILE环是我,不是因为我的查询设计为一次对整个行集的运行来比较性能的好办法。对于一次只能对一百万行运行一遍(基本上将其强制进入虚拟UDF土地)对我来说没有意义,这是OP给出的用于执行的用例场景这是针对大型行集的。因此,这里是要针对1,000,000行进行测试的脚本(测试脚本需要SQL
Server 2005及更高版本)。

DECLARE
   @Buffer varchar(16),
   @Start datetime;

SET @Start = GetDate();
WITH A (N) AS (SELECT 1 FROM (VALUES (1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) A (N)),
B (N) AS (SELECT 1 FROM A, A X),
C (N) AS (SELECT 1 FROM B, B X),
D (N) AS (SELECT 1 FROM C, B X),
N (Num) AS (SELECT Row_Number() OVER (ORDER BY (SELECT 1)) FROM D)
SELECT @Buffer = dbo.HinkyBase26(N.Num)
FROM N
;
SELECT [HABO Elapsed Milliseconds] = DateDiff( ms, @Start, GetDate());

SET @Start = GetDate();
WITH A (N) AS (SELECT 1 FROM (VALUES (1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) A (N)),
B (N) AS (SELECT 1 FROM A, A X),
C (N) AS (SELECT 1 FROM B, B X),
D (N) AS (SELECT 1 FROM C, B X),
N (Num) AS (SELECT Row_Number() OVER (ORDER BY (SELECT 1)) FROM D)
SELECT
   @Buffer =
      Coalesce((SELECT Char(65 + (N.Num - 475255) / 456976 % 26) WHERE N.Num >= 475255), '')
      + Coalesce((SELECT Char(65 + (N.Num - 18279) / 17576 % 26) WHERE N.Num >= 18279), '')
      + Coalesce((SELECT Char(65 + (N.Num - 703) / 676 % 26) WHERE N.Num >= 703), '')
      + Coalesce((SELECT Char(65 + (N.Num - 27) / 26 % 26) WHERE N.Num >= 27), '')
      + (SELECT Char(65 + (N.Num - 1) % 26))   
FROM N
;
SELECT [ErikE Elapsed Milliseconds] = DateDiff( ms, @Start, GetDate());

结果:

UDF: 17093 ms
ErikE: 12056 ms

原始查询

最初,我通过每个字母生成1行并使用XML进行数据透视连接来实现这种“有趣”的方式,但是尽管确实很有趣,但是事实证明它很慢。这是后代的版本(,需要SQL
2005及更高版本Dense_Rank,但仅将数字转换为字母即可在SQL 2000中使用):

WITH Ranks AS (
   SELECT
      Num = Dense_Rank() OVER (ORDER BY T.Sequence),
      T.Col1,
      T.Col2
   FROM
      dbo.YourTable T
)
SELECT
   *,
   LetterCode =
      (
         SELECT Char(65 + (R.Num - X.Low) / X.Div % 26)
         FROM
            (
               SELECT 18279, 475254, 17576
               UNION ALL SELECT 703, 18278, 676
               UNION ALL SELECT 27, 702, 26
               UNION ALL SELECT 1, 26, 1
            ) X (Low, High, Div)      
         WHERE R.Num >= X.Low
         FOR XML PATH(''), TYPE
      ).value('.[1]', 'varchar(4)')
FROM Ranks R
ORDER BY R.Num
;

在SQL Fiddle上观看现场演示



 类似资料:
  • 所以我是计算机科学的新手,我们被要求做的一件事是尝试创建一个程序,首先将用户输入的一个单词转换成一个数字串,a=1,b=2,z=26等等,还有一些其他的事情,因为它们是扩展,我现在不想讨论。诚然,她说她不介意我们完成它,因为这是我们今天的第一节java课程。 有鉴于此,有人能给我一些关于如何做到这一点的建议吗?我不想让一段完整的代码完全做到这一点,因为我需要学习,因此非常感谢指导之手。到目前为止,

  • 问题内容: 您可以使用以下代码来增加伪元素中的数字。 有没有一种方法可以使用相同的代码来递增字母,例如“ a”,“ b”,“ c”等? 谢谢! 问题答案: 是的,的第二个参数定义了使用的计数器的类型,例如来自常规或的;例如: 其他包括:,,,,,,,,,,。 由于上面的样式列表似乎有所更新,我选择添加一个代码段,该代码段使用户可以从(当前)可用选项中进行选择,以及一个“输出”区域,以显示如何在CS

  • 本文向大家介绍Lua判断变量是否为数字、字符串是否可以转换为数字等,包括了Lua判断变量是否为数字、字符串是否可以转换为数字等的使用技巧和注意事项,需要的朋友参考一下 一、Lua 判断是字符还是数字 二、Lua判断数字 判断显式 type可以判断已经转换的类型,但是会区分字符串,因为它看的是原始类型。 经验 1.判断可否转换 而直接用转换来测试可以判断是否能够转成那个类型,也就是能否是那个类型的字

  • 是否可以将Java字节码自动转换为IJVM?你知道有什么可能性吗?

  • 我试图找到一种方法来将像“t2hr8var4tnuloglmibpabyvdri1y02rbx”这样的长字符串ID转换为数字ID。 A=10,B=20,C=50, ABC=10+20+50=80 BAC=20+10+50=80 所以ABC=102050 这个方法不起作用,因为有一个20个字母的字符串会导致一个巨大的数字,所以我如何解决这个问题?提前谢谢你。

  • 问题内容: 我有一个以10为底的数字。是否有将其转换为以62为底的数字? 例: PHP 可以转换为基数36。 问题答案: OLD :一个快速而肮脏的解决方案可以是使用如下函数: 基数转换将您的数字转换为数字为0-9a-p的基数,然后使用快速的char替换摆脱其余的数字。 如您所见,该功能易于逆转。 顺便说一句,您将使用此功能做什么? 编辑: 根据问题的更改和@jnpcl的答案,这是一组函数,它们执