1

この質問からいくらかの助けを得ましたが、さらに支援が必要です。

次に利用可能な 2 桁の英数字コードを生成できるようにする必要があります。あなたが尋ねる前に、テーブル定義を変更することはできません。私はT-SQLで働いています。

たとえば、私がシーケンスを持っているとしましょう

00, 01, 02,..., 09, 0A, 0B, 0C,..., 0Y, 0Z, 10, 11,...1Y, 1Z, 20, 21,..., 9Y, 9Z, I次の ID を A0 にしたいのですが、

次に A1、A2、...、A9、AA、AB、AC、...、AZ、次の ID を B0、次に B1 などにしたいと思います。

要するに、私は 00 から ZZ までずっと移動し、そのたびにそのフィールドで MAX を探し、その最大値より 1 大きい新しいコードを割り当てたいと考えています。A > 9 であり、最初の列が 2 番目の列よりも大きいため、A0 > 99 および AA > A9 であることがわかります。

これらすべてに数値 ID を割り当てることができたらいいのにと思いますが、この時点ではテーブル定義がより重要であるため、変更することはできません。限られたスペース。

ご協力ありがとうございました。

4

2 に答える 2

2

これを見てください。これは ID にとって非常に厄介な問題です。2 文字のキーの順列の数を効果的に制限しました。また、ZZ が使用され、このアルゴリズムが再び実行される場合に対処する必要がある問題もあります。デモンストレーションのために、これらを可能な限り論理的な手順に拡張しましたが、必要に応じて自由に要約してください。

DECLARE @ExistingTable TABLE (ID CHAR(2))
INSERT INTO @ExistingTable (ID) VALUES ('5A'),('5B')

DECLARE @NewID CHAR(2)

;WITH
Ranks AS (
    SELECT '0' AS [Character] UNION SELECT '1' AS [Character] UNION SELECT '2' UNION SELECT '3' UNION SELECT '4' UNION SELECT '5' UNION SELECT '6' UNION
    SELECT '7' UNION SELECT '8' UNION SELECT '9' UNION SELECT 'A' UNION SELECT 'B'UNION
    SELECT 'C' UNION SELECT 'D' UNION SELECT 'E' UNION SELECT 'F' UNION SELECT 'G' UNION SELECT 'H' UNION
    SELECT 'I' UNION SELECT 'J' UNION SELECT 'K' UNION SELECT 'L' UNION SELECT 'M' UNION SELECT 'N' UNION
    SELECT 'O' UNION SELECT 'P' UNION SELECT 'Q' UNION SELECT 'R' UNION SELECT 'S' UNION SELECT 'T' UNION
    SELECT 'U' UNION SELECT 'V' UNION SELECT 'W' UNION SELECT 'X' UNION SELECT 'Y' UNION SELECT 'Z'
), Permutations AS (
    SELECT  SecondChar.[Character] + FirstChar.[Character] AS PermuteID
    FROM    Ranks AS FirstChar
            CROSS JOIN Ranks AS SecondChar
), PermutationsKeyed AS (
    SELECT  ROW_NUMBER() OVER (ORDER BY PermuteID ASC) AS PrimaryKeyHolder,
            PermuteID
    FROM    Permutations
), MaxPK AS (
    SELECT  MAX(Perm.PrimaryKeyHolder) + 1 AS MaxPK
    FROM    @ExistingTable AS E
            INNER JOIN PermutationsKeyed AS Perm ON (E.ID = Perm.PermuteID)
)
SELECT  @NewID = Perm.PermuteID
FROM    PermutationsKeyed AS Perm
        INNER JOIN MaxPK AS M ON (Perm.PrimaryKeyHolder = M.MaxPK)


SELECT @NewID
于 2015-03-23T22:45:51.593 に答える
0

次の値を返す方法はわかりませんが、これはすべての値を取得するためのシンプルで効率的な方法だと思います。他に何か必要な場合はお知らせください。

DECLARE @values TABLE (val CHAR(1));
DECLARE @int        INT = 48,
        @letters    INT = 65;

IF OBJECT_ID('dbo.tbl_keys') IS NOT NULL
    DROP TABLE dbo.tbl_keys;

--This will hold the values so you can always reference them
CREATE TABLE dbo.tbl_Keys
(
    --Primary key will create a clustered index on rank_id by default
    rank_id INT PRIMARY KEY,
    ID_Code CHAR(2)
);
--Another index on ID_Code
CREATE NONCLUSTERED INDEX idx_ID_Code ON tbl_keys(ID_Code);

--This is how I get all your individual values
WHILE (SELECT COUNT(*) FROM @values) < 36
BEGIN
    IF(@int <= 57)
        INSERT INTO @values VALUES(CHAR(@int));

    INSERT INTO @values
    VALUES (CHAR(@letters))

    SET @int = @int + 1;
    SET @letters = @letters + 1;
END

--Insert all possible combinations and rank them
INSERT INTO tbl_Keys
    --ASCII is your best friend. It returns the ASCII code(numeric value) for characters
    SELECT  ROW_NUMBER() OVER (ORDER BY ASCII(A.val),ASCII(B.val)) AS rank_id,
            A.val + B.val ID
    FROM @values A
    CROSS JOIN @values B;

次の ID_code (コメントを読む) を取得する 2 つの異なる方法を提供します。

--Here's some dummy data
WITH CTE_DummyTable
AS
(
    SELECT '00' ID_Code
    UNION ALL
    SELECT '01'
    UNION ALL
    SELECT '02'
)


----Here's how to get the next value with the assumption there are no gaps in your data
--SELECT MIN(ID_Code) next_id_code
--FROM tbl_Keys
--WHERE ID_code > (SELECT MAX(id_code) FROM CTE_DummyTable)

--This one doesn't assume the gaps and returns the lowest available ID_code
SELECT MIN(ID_Code) next_id_code
FROM tbl_Keys
WHERE ID_code NOT IN (SELECT DISTINCT id_code FROM CTE_DummyTable)

:何らかの理由でランクを変更せずに英数字の値を非常に簡単に変換したい場合は、これを試してください。

SELECT  rank_id,
    ID_code,
    CAST(CONCAT(ASCII(LEFT(id_code,1)),ASCII(RIGHT(id_code,1))) AS INT) AS numeric_id_code
FROM tbl_Keys
于 2015-03-25T14:46:07.007 に答える