在我的一个专栏中,值和序列存储在一起。例如
Country= US Product= Shoe 那么商品代码是US000SHOE
如果存在同一国家和同一产品,则该产品 ID 将为US001SHOE。
如您所见,每次为一个国家/地区添加产品时,我们都必须将数字加一。我应该如何从字符串值中获取数字并增加它?
在我的一个专栏中,值和序列存储在一起。例如
Country= US Product= Shoe 那么商品代码是US000SHOE
如果存在同一国家和同一产品,则该产品 ID 将为US001SHOE。
如您所见,每次为一个国家/地区添加产品时,我们都必须将数字加一。我应该如何从字符串值中获取数字并增加它?
你为什么不简单地有三列
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
当您插入表格时,您甚至不必关心增加自己。
创建以下函数以从相关字符串中提取数字
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
)
下面的代码将使用函数提取数字,加 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)
这是一个基于使用 aSUBSTRING
和中间三个数字(仅)递增的示例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
则上面的示例将不起作用,在这种情况下,您最好将所有内容都分解成临时表上的部分,然后在添加所有内容(或之间的某个表)的情况下进行最终插入开头和结尾)。