5个字符的字符串ID,如Northwind CustomerID

时间:2018-05-22 10:08:24

标签: sql sql-server string concatenation northwind

我希望从字符串名称中获取一个5个字符长的字符串,就像它在MS Northwind sample database中一样(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
...         ...

因此ID(代码)不是完全随机的,它在某种程度上类似于字符串名称的内容。显然,禁止双重性,代码必须是唯一的。我们假设:

DECLARE @StrCode NCHAR(5)

我开始在theese线上进行操作 - 我会创建一个标量函数来检查重复数据,这些重复数据将返回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键相比,这个字符串键不会减慢速度吗?

0 个答案:

没有答案