Sql server 获取子字符串,将其强制转换为int,增加它并对其进行concat
这应该实现的是获得列NR的最大数目,该列前面有一个Sql server 获取子字符串,将其强制转换为int,增加它并对其进行concat,sql-server,tsql,Sql Server,Tsql,这应该实现的是获得列NR的最大数目,该列前面有一个~ 这似乎适用于10以下的数字。但是一旦我在XY中有一个条目,其中NR是~10,它总是返回相同的结果,我似乎不知道为什么。因此,我认为以下是该声明的细目: 从内到外: 首先,我得到最大数长度的子串,该子串前面有一个从位置2开始的NR的波浪线(仅为数字),以便忽略波浪线 然后我增加数字并将其作为字符串处理 最后,我准备了一块瓷砖,并对其进行了处理。在我看来,这应该达到预期的产出 表XY: 身份证件 天然橡胶 11 ~1 12 ~2 13 ~3 14
~
这似乎适用于10以下的数字。但是一旦我在XY中有一个条目,其中NR是~10,它总是返回相同的结果,我似乎不知道为什么。因此,我认为以下是该声明的细目:
从内到外:
首先,我得到最大数长度的子串,该子串前面有一个从位置2开始的NR的波浪线(仅为数字),以便忽略波浪线
然后我增加数字并将其作为字符串处理
最后,我准备了一块瓷砖,并对其进行了处理。在我看来,这应该达到预期的产出
表XY:
身份证件
天然橡胶
11
~1
12
~2
13
~3
14
~4
15
~5
16
~6
17
~7
18
~8
17
~9
18
~10
根据您的描述,
NR
是一个字符串。虽然您正在强制转换为int
,但似乎有些地方出了问题。我建议将查询简化为以下内容:
select
CONCAT('~', (cast (ISNULL((select substring(max(NR), 2, len(max(NR)) - 1)
from XY
where left(NR, 1) = '~'), 0) AS int) + 1))
请注意,存储编码在字符串中的整数通常不是一个好主意。为什么不使用identity()
列或序列存储一个整数呢
是一个dbfiddle。通常最好使用适当的日期类型存储各个元素,并将构造格式化字符串的任务留给计算列(或表示层)而不是存储一个格式化的值,然后必须撤消格式化才能再次使用元素。@Damien_the_unsiver是的,这肯定是一个设计缺陷。但是,业务逻辑需要向用户提供实体的临时名称。此解决方案在GUI端的工作量更少。至少对我来说是这样。
select concat('~',
coalesce(max(cast(stuff(nr, 1, 1, '') as int)) + 1, 1)
), stuff(max(nr), 1, 1, ''), max(nr)
from XY
where nr like '~%';