SQL 取最大字符

yanm7788 2009-04-10 04:46:09
具体情况:
Excel 导出模板事先定义好到数据库里头(导出的列名,导入到哪一列)
遇到的问题:我在添加一个导出列,系统应该自动按Excel的列添加,如A,B,..Z,AA,AB.
我现在用的方法是直接用SQL语句
Select CHAR(ISNULL(MAX(ASCII(EXCEL_COL)),64)+1) MaxExcelCol From SV_EXCEL_FRMT_ID where Frmt_id='AA'
.这样的话超过Z了就不再是所要求的AA,AB.
EXCEL_COL里保存的就是要对应的EXCEL列,应为A,B,..Z,AA,AB这样的格式.

请问各位有什么好的方法能够帮我解决这个问题.....请各位发表下你们好的想法,有代码更好.
...全文
240 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanm7788 2009-04-11
  • 打赏
  • 举报
回复
select top 1 Excel_col=case when right(excel_col,1)='z' then replicate('A',len(excel_col)+1)
else left(excel_col,len(excel_col)-1) end +char(ascii(right(excel_col,1))+1)
from excel_frmt_id ORDER BY LEN(EXCEL_COL) DESC,EXCEL_COL DESC

这个是我最后要用到的,谢谢各位的帮助.可能表达没有太清楚有点误导了各位.谢谢了.
csdyyr 2009-04-10
  • 打赏
  • 举报
回复
DECLARE @STR VARCHAR(8)
SET @STR='AAAAAAAA'
SET @STR=REVERSE(@STR)

SELECT REVERSE(
STUFF(@STR,
PATINDEX('%[^Z]%', @STR),
1,
CHAR(ASCII(SUBSTRING(@STR,PATINDEX('%[^Z]%', @STR), 1))+1)
)
)
  • 打赏
  • 举报
回复
楼主好像是要生成excel中的列名,而不是查询列名
  • 打赏
  • 举报
回复
思路:用col来代替你要的列名,
case when right(col,1)='z' then replicate('A',len(列名)+1) else left(col,len(col)-1)end +char(ascii(right(col,1)+1)

也就是说先检测最右边的一个字母,如果为z的话,那么就把A重复现有列的长度次,即生成AAA之类的,如果不到Z,那么截取前N-1个字符,然后加最后一个字符的下一个字符
百年树人 2009-04-10
  • 打赏
  • 举报
回复
---测试数据---
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([col] varchar(2))
insert [tb]
select 'A' union all
select 'B' union all
select 'C' union all
select 'D' union all
select 'Z' union all
select 'AA' union all
select 'AB'

---查询---
select
top 1
col
from
tb
order by
len(col) desc,
col desc


---结果---
col
----
AB

(所影响的行数为 1 行)
百年树人 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yanm7788 的回复:]
引用 1 楼 josy 的回复:
没看懂...

order by
len(col),
col

是在EXCEL_COL里假如存在A到Z这个范围的字母就取出的值应该为Z
如果到了A,B...Z,AA,AB应该得到AB.
[/Quote]

select 
top 1
col
from
tb
order by
len(col) desc
col desc

这样?
playwarcraft 2009-04-10
  • 打赏
  • 举报
回复
没怎么懂意思
不过,Excel一共就256列,你还不如建一个256笔资料的table来一一对应呢,省的麻烦
水族杰纶 2009-04-10
  • 打赏
  • 举报
回复
--這樣?
DECLARE @T TABLE( EXCEL_COL VARCHAR(10))
INSERT @T SELECT 'A'
INSERT @T SELECT 'B'
INSERT @T SELECT 'C'
INSERT @T SELECT 'AB'
INSERT @T SELECT 'D'
INSERT @T SELECT 'AA'
SELECT TOP 1 EXCEL_COL FROM @T ORDER BY LEN(EXCEL_COL) DESC,EXCEL_COL DESC
/*EXCEL_COL
----------
AB

(影響 1 個資料列)*/
sdhdy 2009-04-10
  • 打赏
  • 举报
回复
说的不太明白。
yanm7788 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 josy 的回复:]
没看懂...

order by
len(col),
col
[/Quote]
是在EXCEL_COL里假如存在A到Z这个范围的字母就取出的值应该为Z
如果到了A,B...Z,AA,AB应该得到AB.
Zoezs 2009-04-10
  • 打赏
  • 举报
回复
看错了。
Zoezs 2009-04-10
  • 打赏
  • 举报
回复

Select CHAR(ISNULL(MAX(unicode(EXCEL_COL)),64)+1) MaxExcelCol From SV_EXCEL_FRMT_ID where Frmt_id='AA'

百年树人 2009-04-10
  • 打赏
  • 举报
回复
没看懂...

order by
len(col),
col

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧