4

nvarchar 列にいくつかの文字列値が既に入力されています。文字列の形式は次のようになります。

例: 16B、23G、128F、128M など...

これらから最大値を見つけて、コードから次の値を生成する必要があります。最大アイテムを拾うためのロジックは次のようになります。

  1. 数字が最も大きい文字列をピックアップします。
  2. 最大数が複数の場合は、その中から最大のアルファベットを文字列に取り出します。

たとえば、上記のシリーズの最大の文字列は 128M です。

次に、次のシーケンスを生成する必要があります。次の文字列は

  1. 最大のものと同じ数字ですが、アルファベットが 1 ずつ増えます。IE 128N
  2. アルファベットが Z に達すると、数字が 1 増加し、アルファベットは A になります。たとえば、128Z の次の文字列は 129A です。

目的の文字列を取得できる SQL の種類を教えてください。

4

5 に答える 5

5

テーブル定義を変更できる場合 (*)、基本的な値を完全に数値のままにして、これらの文字列にフォーマットするだけの方が簡単です。

create table T (
    CoreValue int not null,
    DisplayValue as CONVERT(varchar(10),(CoreValue / 26)+1) + CHAR(ASCII('A') + (CoreValue-1) % 26)
)
go
insert into T (CoreValue)
select ROW_NUMBER() OVER (ORDER BY so1.object_id)
from sys.objects so1,sys.objects so2
go
select * from T

結果:

CoreValue   DisplayValue
----------- ------------
1           1A
2           1B
3           1C
4           1D
5           1E
6           1F
....
22          1V
23          1W
24          1X
25          1Y
26          2Z
27          2A
28          2B
29          2C
....
9593        369Y
9594        370Z
9595        370A
9596        370B
9597        370C
9598        370D
9599        370E
9600        370F
9601        370G
9602        370H
9603        370I
9604        370J

したがって、新しい値を挿入するの、列から を取得して 1 を追加するのと同じくらい簡単ですMAX(複数のユーザーに対処するために、シリアライズ可能な分離などを想定しています)。


(*) テーブル定義を変更できない場合でも、このテーブルを生成します。MAX次に、それを元のテーブルに結合し、それを使用して列に対して単純な操作を実行しint、次に使用する英数字の値を追加して検索することができます。使用すると予想される値をいくつでも入力するだけです。

于 2012-09-28T14:45:28.377 に答える
1

仮定:

CREATE TABLE MyTable
    ([Value] varchar(4))
;

INSERT INTO MyTable
    ([Value])
VALUES
    ('16B'),
    ('23G'),
    ('128F'),
    ('128M')
;

できるよ:

select top 1 
    case when SequenceChar = 'Z' then
        cast((SequenceNum + 1) as varchar) + 'A'
    else
        cast(SequenceNum as varchar) + char(ascii(SequenceChar) + 1)
    end as NextSequence
from (
    select Value, 
        cast(substring(Value, 1, CharIndex - 1) as int) as SequenceNum, 
        substring(Value, CharIndex, len(Value)) as SequenceChar
    from (
        select Value, patindex('%[A-Z]%', Value) as CharIndex
        from MyTable
    ) a
) b
order by SequenceNum desc, SequenceChar desc

SQL フィドルの例

于 2012-09-28T15:05:02.970 に答える
0

列が常に記述した形式(数字+ 1文字の接尾辞)に従うと仮定すると、次のことができます

WITH cte1 AS(
SELECT LEFT(your_column,LEN(your_column)-1) as num, 
RIGHT(your_column,1) as suffix
FROM your_table),
cte2 AS (SELECT MAX(num) as max_num FROM cte1)
SELECT 
 CASE c.max_suffix
  WHEN 'Z' THEN 'A'
  ELSE NCHAR(UNICODE(c.max_suffix)+1)
 END as next_suffix,

CASE c.max_suffix
 WHEN 'Z' THEN a.max_num+1
 ELSE a.max_num
END as next_num

FROM  cte2 a 
CROSS APPLY (SELECT MAX(suffix) as max_suffix FROM cte1 b WHERE b.num=a.max_num)c
;

同じことを行う方法が他にもあると確信しています。また、私のアプローチは最適ではないようですが、必要なものが返されると思います...

Damien_The_Unbelieverが推奨するように、テーブルを再設計できれば、はるかに優れていることは間違いありません。

于 2012-09-28T14:59:25.483 に答える
0

以下の形式で英数字文字列シーケンスを生成します。AB C……YZ AA AB……AZ BA BB……BZ……続きます。

CREATE OR REPLACE FUNCTION to_az(in_num  number)

RETURN VARCHAR2

IS

 num          PLS_INTEGER    := TRUNC (in_num) - 1;
 return_txt     VARCHAR2 (1) := CHR (65 + MOD (num, 26));

BEGIN

 IF  num <= 25
 THEN
      RETURN     return_txt;
 ELSE
      RETURN     to_az (FLOOR (num / 26))
           || return_txt;
 END IF;
END to_az;
于 2013-12-11T11:55:02.450 に答える
0

「P0001」、「P0002」などの英数字の次のシーケンス ID を生成する Ms-sql 関数。

ALTER FUNCTION NextProductID()
 returns varchar(20)
 BEGIN
    DECLARE  @NEXTNUMBER INT;
    DECLARE @NEXTPRODUCTID VARCHAR(20);
 SELECT @NEXTNUMBER=MAX( CONVERT(INT, SUBSTRING(PRODUCT_CODE,2,LEN(PRODUCT_CODE))))+1 FROM Product;
    --PRINT @NEXTNUMBER;
    SET @NEXTPRODUCTID=CONVERT(VARCHAR,@NEXTNUMBER)
    SELECT @NEXTPRODUCTID='P'+REPLICATE('0',6-LEN(@NEXTPRODUCTID)) + @NEXTPRODUCTID;
  return @NEXTPRODUCTID;
END

ここで product はテーブル名で、product_code は列です

于 2014-03-22T16:46:23.907 に答える