MS SQL 2005 - 增加String数据中的数字

时间:2013-08-18 12:35:45

标签: sql-server hibernate

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

国家=美国 Product = Shoe然后商品代码将 US000SHOE

如果存在相同的国家/地区和相同的产品,则该产品ID将 US001SHOE

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

3 个答案:

答案 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)

以下是根据使用SUBSTRINGCASE 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)