0

我想清理邮政编码列上的数据。

到目前为止我有

declare @postcode table
(
letter1 varchar(4)
,number1 varchar(4)
,number2 varchar(4)
,letter3 varchar(4)
)

insert into @postcode values
('a','1','1','a'),
('b','2','2','b'),
('c','3','3','c')

一直到字母表

(null,'37','37',null)

我的问题是我需要选择一个随机字母,然后是数字,然后是字母,所以邮政编码看起来像

d12 4RF

我的其余代码如下:

declare @postcodemixup table
                      (ID int identity(1,1)
                       ,Postcode varchar(20))

declare @rand varchar(33)

/*pick a random row and mash it up */
declare @realpostcode varchar (30)

select @realpostcode = letter1 + '' +number1 + ' ' + number1 + '' + letter2 
from @postcode 
where letter1 = 'a'

select @realpostcode

insert into @postcodemixup values(@realpostcode), (@realpostcode)

select * from @postcodemixup

任何答案、阅读材料或建议都会很棒。

谢谢,

周杰伦

4

3 回答 3

1

不确定这是否正是您需要的,但假设所需的公式是“字母-数字-数字-空格-数字-字母-字母”(根据图片),可以使用以下语句生成数据:

;with
    A as (select cast(char((rand(checksum(newid())) * 26) + ascii('A')) as varchar(10)) A),
    D as (select cast(cast(rand(checksum(newid())) * 10 as int) as varchar(10)) D)
select top (10000)
    row_number() over (order by @@spid) as id,
    A1.A + D1.D + D2.D + ' ' + D3.D + A2.A + A3.A as postcode
from sys.all_columns c1, sys.all_columns c2,
    A A1, D D1, D D2, D D3, A A2, A A3
于 2013-07-12T23:48:41.953 回答
1

一些可能有帮助的事情:

要获得 1 到 37 之间的随机整数: CONVERT(int, RAND() * 37) + 1

获取随机字母: CHAR((RAND() * 26) + ASCII('A'))

如果你想要一个随机的行,你可以试试这个,虽然它不会特别快:

declare @rowCount int
    ,   @randomRow int

select @rowCount = COUNT(*) FROM Table1
select @randomRow = RAND() * @rowCount + 1

With A
as  (
  select Table1.*
      ,  rownumber = ROW_NUMBER() OVER (Order BY ID) -- order by something, doesn't matter what
  from   Table1
)
select * 
from   A 
where  rownumber = @randomRow
于 2013-07-12T20:46:39.643 回答
0

如果您的随机邮政编码必须基于 @postcode 表中预定义的值,请尝试以下查询:

set @realpostcode = (select top 1 letter1 from @postcode order by NEWID()) + 
                (select top 1 number1 from @postcode order by NEWID()) +
                (select top 1 number2 from @postcode order by NEWID()) +
                (select top 1 letter2 from @postcode order by NEWID())
于 2013-07-12T20:52:26.820 回答