5-значный идентификатор строки, например, Northwind CustomerID - PullRequest
0 голосов
/ 22 мая 2018

Я хочу получить 5-символьную строку, скомпилированную из имени строки, точно так же, как в Пример базы данных MS Northwind (Customers.CustomerID):

CustomerID  CompanyName
-----       ----------------------------------
ALFKI       Alfreds Futterkiste
ANATR       Ana Trujillo Emparedados y helados
ANTON       Antonio Moreno Taquería
AROUT       Around the Horn
BERGS       Berglunds snabbköp
BLAUS       Blauer See Delikatessen
BLONP       Blondesddsl pere et fils
BOLID       Bólido Comidas preparadas
BONAP       Bon app'
BOTTM       Bottom-Dollar Markets
BSBEV       B's Beverages
...         ...

Итакидентификатор (код) не является полностью случайным, он как-то напоминает содержимое имени строки.Очевидно, что двуличие запрещено, код должен быть уникальным.Давайте предположим:

DECLARE @StrCode NCHAR(5)

Я бы начал с разбивки по этим линиям - я бы создал скалярную функцию для проверки дубликатов, которая возвращала бы 0 для отсутствия дубликатов и 1 для найденных дубликатов, проверка ядра была бы простосчитая строки предоставленного строкового кода:

SELECT COUNT(ID) FROM MyTable WHERE StrCode = @StrCode  

А затем в другой функции (input = StringName, output = @StrCode) я бы попробовал несколько подходов, от самого читаемого до наименее читаемого, ипроверяйте каждую попытку на двойственность на своем пути:

SELECT @StrCode =
   CASE 
      WHEN dbo.CheckForDuplicity(SUBSTRING(@StringName,1,6)) = 0     
         THEN SUBSTRING(@StringName,1,6)  -- get start of the string name
      WHEN CHARINDEX(' ',@StringName) > 0 AND dbo.CheckForDuplicity(CONCAT(SUBSTRING(@StringName,1,3),SUBSTRING(@StringName,CHARINDEX(' ',@StringName)+1,2))) = 0
         THEN CONCAT(SUBSTRING(@StringName,1,3),SUBSTRING(@StringName,CHARINDEX(' ',@StringName)+1,2))   -- get 3 chars from the 1st word and 2 chars from the 2nd
      WHEN dbo.CheckForDuplicity(CONCAT(SUBSTRING(@StringName,1,3),SUBSTRING(@StringName,LEN(@StringName)-3,2))) = 0
         THEN CONCAT(SUBSTRING(@StringName,1,3),SUBSTRING(@StringName,LEN(@StringName)-3,2))             -- get first 3 chars  and last 2 chars
      -- possibly other approaches...
   END

Таким образом, первая будет принята.Но, может быть, есть и лучшие подходы, о которых я не знаю ...

Это всего лишь концепция.Это хорошая идея?

А как насчет использования этого StringCode в качестве первичного ключа, как это делают в Northwind?Не замедлит ли этот строковый ключ, по сравнению с ключом INT?

...