【问题标题】:Randomise numeric values in certain position in sql serversql server中某个位置的随机数值
【发布时间】:2014-07-21 00:53:21
【问题描述】:

我在表中有一个 NVCHAR(30) 列,我需要随机化具有特定开始和结束位置的数值,并且该列包含不同格式的数值。

示例
值类型 1

337-27636993-219322

值类型 2

01121041303803168640

对于框类型,我需要随机化从位置 5 开始到位置 12 结束的值,因此通过示例提供以下数字是我期望随机化的。

27636993
10413038

我知道如何使用子字符串来查找起始位置和长度,但这只会提取出我想要随机化的值。我需要的是 sql 代码来选择我需要的一组值,将它们随机化,然后对现有数字进行更新。

所以如果原来的数字如下;

337-27636993-219322

生成的新号码是;

56413037

表格中的最终结果是;

337-56413037-219322

我对 SQL 很有信心,但我不是专家,因此我们将不胜感激所有帮助

【问题讨论】:

  • 对不起,这一定是我的英语表现不佳,但是“对于盒子类型”是什么意思?是否代表“对于类型 1 的值”?
  • 你这样做是为了什么?为什么只需要随机化“中间”的一组数字?为什么你不能随机化整个事情?

标签: sql sql-server substring


【解决方案1】:

您想使用stuff() 和随机数生成器。像这样的东西应该可以工作:

SELECT Stuff(col, 5, 8, RIGHT(Replicate('0', 8) 
                              + Cast(Cast(Rand(Checksum(Newid()))*100000000 AS 
                              INT) AS 
                                     VARCHAR(255)), 8)) 

这个想法很简单。 stuff() 将替换字符串中的字符,这正是您想要做的。将随机数生成为字符串需要一些工作。

  • rand(checksum(newid())) 生成随机数
  • rand(checksum(newid())) * 100000000 创建一个 8 位数字(带小数点)
  • 然后将其转换为一个整数(足以存储此表达式)
  • 然后将其转换为字符串
  • 在前面加上'0's,所以如果少于 8 个字符,它们将被填充
  • 然后使用right()获取8位数字

【讨论】:

  • 谢谢 Gordon Linoff,您的解决方案正是我所需要的。
猜你喜欢
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
相关资源
最近更新 更多