如何生成特定长度的单列?
Posted
技术标签:
【中文标题】如何生成特定长度的单列?【英文标题】:How to produce a single column of a specific length? 【发布时间】:2020-06-29 13:44:41 【问题描述】:这并不像看起来那么简单。我已经挣扎了几个小时,谷歌搜索无济于事。
我想生成一个长度始终为 30 个字符的单列,因此如果该列仅包含 2 个字符,则其他 28 个字符应为空格。
我正在尝试将两个不同的列合并为一个列,如下所示:
选择名字 + 姓氏作为全名
我想得到以下结果:
这意味着第一行将有 7 个可见字符 (Michael),然后是 8 个空格,然后是 6 个可见字符 (Jordan),然后是 9 个空格。总共有30个字符。 第二行将有 5 个可见字符(Magic),然后是 10 个空格,然后是 7 个可见字符(Johnson),然后是 8 个空格。 第三行将有 5 个可见字符(Larry),然后是 10 个空格,然后是 4 个可见字符(Bird),然后是 11 个字符。
两列的长度总是不同的,所以我正在寻找不管长度如何都能工作的代码。这意味着它总是在名字后添加正确数量的空格。您可能已经注意到,名字总是 15 个字符(可见或空),姓总是另外 15 个字符(可见或空)。
有人知道怎么做吗? 提前致谢!
【问题讨论】:
如果名字正好是 15 个字符怎么办,例如MyQuiteLongName
?然后我们输出MyQuiteLongNameSurname
,还是删除一个字符以确保之间有空格?
我只是想让这个例子更简单。就我而言,它实际上是 30 个字符。不能再长了。如果是,则第二部分紧随其后,没有空格
【参考方案1】:
使用char()
:
select concat(convert(char(15), firstname), convert(char(15), lastname))
char()
类型会自动用空格填充字符串,因此无需进行更多工作。这还有一个很好的功能,如果名字或姓氏太长,则只使用前 15 个字符。
对于len()
,这是明确的documented(我认为是为了符合标准):
返回指定字符串表达式的字符数,不包括尾随空格。
遵循此建议:
注意
要返回用于表示表达式的字节数,请使用 DATALENGTH 函数。
Here 是一个 dbfiddle。
SQL Server 在测量长度时会忽略空格。因此,在上面的长度中,您将得到 21 和 20。要查看长度而不删除尾部空格,请使用 datalength()
。
【讨论】:
哇,@GordonLinoff 的回答多么简短而甜蜜!我本来打算回答的,但是看到你的之后,我太尴尬了,不敢回答,哈哈。给我点赞:-) 当我用你的代码或在 db fiddle 上尝试它时,我做对了,但不是用我的 sql server 您在 SQL Server 上获得了什么?您如何查看 SSMS 中的结果? 是不是真的是对的,只是空的空间比使用的空间小?我的意思是,我的结果没有显示第二行的姓氏与第一行的姓氏在同一点开始,但可能是可见空间比空白空间大得多。否则,我不知道为什么它“似乎”不起作用 实际上,它似乎并没有像预期的那样工作。我会假设我从以下得到 60 的长度:以上是关于如何生成特定长度的单列?的主要内容,如果未能解决你的问题,请参考以下文章