在我的一个专栏中,值和序列存储在一起。例如
国家=美国 Product = Shoe然后商品代码将 US000SHOE
如果存在相同的国家/地区和相同的产品,则该产品ID将 US001SHOE 。
如您所见,每次为某个国家/地区添加产品时,我们都必须将该数字增加一个。我该如何从String值中获取数字并将其递增?
答案 0 :(得分:1)
为什么你不只是有三列
country | an_auto_increment_column | product
(在sql-server中,auto_increment是一个标识列)
要获取产品代码,您可以动态构建
SELECT
country + right('000' + an_auto_increment_column, 3) + product AS your_brandnew_ProductID
FROM yourTable
当你插入表格时,你甚至不必关心自己增加。
答案 1 :(得分:0)
以下是根据使用SUBSTRING
和CASE WHEN
来增加中间三个数字(仅)的示例:
CREATE TABLE ##Values(
ColumnValue VARCHAR(25)
)
INSERT INTO ##Values
VALUES ('US000SHOE')
, ('US001SHOE')
SELECT *
FROM ##Values
-- This would be when someone adds a new value to the table (in a procedure or direct call):
DECLARE @countrycode VARCHAR(2)
DECLARE @product VARCHAR(4)
SET @countrycode = 'US'
SET @product = 'SHOE'
INSERT INTO ##Values
SELECT @countrycode +
CASE WHEN LEN(CAST((MAX(SUBSTRING(ColumnValue,3,3)) + 1) AS VARCHAR(3))) = 1 THEN '00' + CAST((MAX(SUBSTRING(ColumnValue,3,3)) + 1) AS VARCHAR(1))
WHEN LEN(CAST((MAX(SUBSTRING(ColumnValue,3,3)) + 1) AS VARCHAR(3))) = 2 THEN '0' + CAST((MAX(SUBSTRING(ColumnValue,3,3)) + 1) AS VARCHAR(2))
ELSE CAST((MAX(SUBSTRING(ColumnValue,3,3)) + 1) AS VARCHAR(3)) END
+ @product
FROM ##Values
SELECT *
FROM ##Values
DROP TABLE ##Values
CASE WHEN
允许您在需要时使用000开始编码,否则TSQL
会认为添加000 + 1 = 1(这在数学上是正确的,但不是您想要的方式值出现)。这也假设您的国家/地区代码只有两个VARCHARS
;如果它们可能在2到5之间,上面示例中的SUBSTRING
将不起作用,在这种情况下,您最好将所有内容分解为临时表,然后添加所有内容进行最终插入(或者在开始和结束之间的一些表格。)
答案 2 :(得分:0)
创建以下函数以从相关字符串中提取数字
create function [dbo].[GetNumbersFromText](@String varchar(2000))
returns table as return
(
with C as
(
select cast(substring(S.Value, S1.Pos, S2.L) as int) as Number,
stuff(s.Value, 1, S1.Pos + S2.L, '') as Value
from (select @String+' ') as S(Value)
cross apply (select patindex('%[0-9]%', S.Value)) as S1(Pos)
cross apply (select patindex('%[^0-9]%', stuff(S.Value, 1, S1.Pos, ''))) as S2(L)
union all
select cast(substring(S.Value, S1.Pos, S2.L) as int),
stuff(S.Value, 1, S1.Pos + S2.L, '')
from C as S
cross apply (select patindex('%[0-9]%', S.Value)) as S1(Pos)
cross apply (select patindex('%[^0-9]%', stuff(S.Value, 1, S1.Pos, ''))) as S2(L)
where patindex('%[0-9]%', S.Value) > 0
)
select Number
from C
)
以下代码将使用函数extrat编号,添加1并将其重新格式化为3位数
DECLARE @S varchar(max)
set @S = 'US000SHOE'
DECLARE @countrycode VARCHAR(2)
DECLARE @product VARCHAR(4)
SET @countrycode = 'US'
SET @product = 'SHOE'
SELECT @countrycode + RIGHT('00'+ CONVERT(VARCHAR,number+1),3) + @product FROM GetNumbersFromText(@S) option (maxrecursion 0)