0

在我的一个专栏中,值和序列存储在一起。例如

Country= US Product= Shoe 那么商品代码是US000SHOE

如果存在同一国家和同一产品,则该产品 ID 将为US001SHOE

如您所见,每次为一个国家/地区添加产品时,我们都必须将数字加一。我应该如何从字符串值中获取数字并增加它?

4

3 回答 3

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

当您插入表格时,您甚至不必关心增加自己。

于 2013-08-18T13:14:54.893 回答
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

)

下面的代码将使用函数提取数字,加 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)
于 2013-08-18T15:42:40.117 回答
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则上面的示例将不起作用,在这种情况下,您最好将所有内容都分解成临时表上的部分,然后在添加所有内容(或之间的某个表)的情况下进行最终插入开头和结尾)。

于 2013-08-18T13:15:19.823 回答