sql - SQL Server 中的转换函数
问题描述
我需要执行一个将 2 个字符转换为整数的函数。
规则是这样工作的:
99 = 99
9A = 100
9B = 101
9C = 102
9D = 103
.
.
.
9Z = 125
AA = 126
AB = 127
例如,我的函数收到“9C”并应返回“102”。该函数必须在 SQL 中完成。
这只是一个例子,存在的序列包含字母表的所有字符和从 0 到 9 的数字。
解决方案
这很有趣也很棘手。我使用了一个计数表来构建 ASCII 表并将 a dense_rank
androw_number
应用于唯一字符和字符对。然后,结果是一个微不足道的case
陈述。
declare @val varchar(2) = '9C'
;WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select
RN = dense_rank() over (order by c.N)
,d = char(c.N)
,d2 = char(c.N) + char(c2.N)
,RN2 = row_number() over (order by c.N, c2.N) + 125
into #myTemp
from cteTally c
cross apply cteTally c2
where c.N between 65 and 90 and c2.N between 65 and 90
--uncomment this code to see how the ranking and row_number worked
--select *
--from #myTemp
--order by RN
select
case
when @val like '[0-9][0-9]' then @val
when @val like '[9][A-Z]' then 99 + (select top 1 RN from #myTemp where d = right(@val,1))
when @val like '[A-Z][A-Z]' then (select RN2 from #myTemp where d2 = @val)
end
drop table #myTemp
推荐阅读
- elasticsearch - Kibana“可用字段”未显示数组内的(字符串)字段
- microsoft-dynamics - Windows 重新启动后运行 Microsoft Dynamics NAV 实例但没有响应
- java - 实例化 groovy 类的正确方法
- swift - Swift 5 CollectionView 通过 longPress 单元格获取 indexPath
- hibernate - CrudRepository:saveAll - 找不到类型的属性 saveAll
- java - java.lang.IllegalMonitorStateException 在 udp 网络上的定时发送失败
- javascript - “更改”功能的复选框在第一次单击时在 Safari 浏览器中不起作用
- apache-kafka - spring cloud stream binder kafka 不起作用
- c - 如何修复找不到“getaddrinfo”定义?
- python - 如何在 Python 包中的 Jupyter Notebook 中显示 .gif