SQL服务器:如何替换功能工作作为其代理奇怪我(SQL Server : how does the

2019-09-20 02:58发布

我是“随机化”在SQL Server表中的一些字符串做一个基本的加密他们。

我有一个嵌套的SQL替换大约35倍(AZ,1-9),基本上发生在字母和数字的每一个字母和另一个字母或数字取代它的功能。 其示例将是

Replace(Replace(Replace('a', 'c'), 'b', 'a'), 'c', 'b')

我盘算了一下,替换功能会去虽然喜欢“ABC”的字符串,并一度取代一切,并停止 - “驾驶室”。 这不!

它似乎想改变一些字符再次导致'abc'->'cab'->'ccb'

这是罚款,除非我有所谓的“AAC”另一个字符串,这可能导致重复的字符串,我输溯源至原来的。

谁能解释我如何能停止REPLACE()部分地回到了我的字符串?

SELECT * INTO example_temp FROM example;
Update KAP_db.dbo.example_temp Set col1 = replace(replace(replace(replace(replace(
replace(replace(replace(replace(replace(‌​replace(replace(replace(replace(replace(
replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(
replace‌​(replace(replace(replace(replace(replace(replace(replace(replace(replace(
col1, 'A', 'N'),'B', 'O'), 'C', 'P'), 'D', 'Q'), 'E', 'R'), 'F', 'S'), 'G', 'T'),
'H', 'U'), 'I', 'V'), 'J', 'W'), 'K', 'X'), 'L', 'Y'), 'M', 'Z'), 'O', 'A'), 'P', 'B'),
'Q', 'C'), 'R', 'D'),'S', 'E'),'T', 'E'),'U', 'E'),'V', 'F'),'W', 'G'),'X', 'H'),
'Y', 'I'),'Z', 'J'), '1', '9'),'2','8'),'3','7'),'4','6'),'5','5'),'6','4'),'7','3'),
'8','2'),'9','1'),' ','');

在“8EVHUAB”和“8EVHHAB”都输出“2DFEENA”上面的结果

更新------------------------------------------------- ------------------

好吧,我已经重做代码,到目前为止有:

 DECLARE @Input AS VarChar(1000)
 DECLARE @i AS TinyInt
 Declare @Substring AS VarChar(1000)
 Declare @Prestring  AS VarChar(1000)
 Declare @Poststring  AS VarChar(1000)

 Select @Input='ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789'

 SELECT @i = 1
 Select @Substring ='na'
 WHILE @i <= LEN(@Input) BEGIN

Select @Prestring = SUBSTRING(@Input,-1,@i)
Select @Poststring = SUBSTRING(@Input,@i+1,LEN(@Input))




 SELECT @Substring =  replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace
(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace
(SUBSTRING(@Input,@i,1), 'A', 'N'),'B', 'O'), 'C', 'P'), 'D', 'Q'), 'E', 'R'), 'F', 'S'), 'G', 'T'), 'H', 'U'), 'I', 'V'), 'J', 'W'), 'K', 'X'), 'L', 'Y'), 'M', 'Z'), 'N', 'A'), '0', 'B'), 'P', 'C')
, 'Q', 'D'),'R', 'E'),'S', 'E'),'T', 'E'),'U', 'F'),'V', 'G'),'W', 'H'),'X', 'I'),'Y', 'J'), '1', '9'),'2','8'),'3','7'),'4','6'),'5','5'),'6','4'),'7','3'),'8','2'),'9','1'),' ','')

Select @Input = @Prestring + @Substring + @Poststring

 SELECT @i = @i + 1


 print 'END
 '

 END

这并不正常工作,虽然,代码不执行其写的,有什么建议?

Answer 1:

为什么你看到的是: replace是一个函数; 所有它知道是它的参数。 replace(replace('aba', 'a', 'b'), 'b', 'a')是绝对等同于replace('bbb', 'b', 'a')这是因为外replace没有知道它的第一个参数是由不同的调用创建的方式replace 。 那有意义吗?

你可以把它就像代数函数。 如果我们定义F(X)= X 2,则f(F(2))= F(2×2)= F(4)= 4 2 = 16,有没有办法告诉F到不同的行为时,其参数为f (2)从时其参数为4时,因为F(2) 4。

同样, replace('aba', 'a', 'b') 'bbb' ,所以没有办法告诉replace不同的行为时,它的第一个参数是replace('aba', 'a', 'b')从当它的第一个参数是'bbb'

(这通常是计算机科学真正的计算机科学函数并不总是像在代数功能-例如,他们经常实际上的事情,而不仅仅是返回一个值-但它通常是他们收到的参数作为值的情况下,或值引用是不透明,并没有办法知道他们来自何处或者他们是如何构建的方式。)

如何解决这个问题:我不认为有任何非常干净的方式来做到这一点。 戈登·利诺夫建议你可以使用中间的占位符字符(具体-小写字母)不初始字符串存在,并在最终的字符串不存在,这样就可以安全地replace他们无需担心干扰; 我认为这可能是最好的办法。



Answer 2:

您现在的结果并不奇怪,因为每个取而代之的是返回字符串到一个新的水平。 有没有办法原始字符值和替换值来区分,当他们是相同的字符。

如果你只用字母字符工作,你可以做到以下几点。

  1. 更改原始字符串的排序规则。
  2. 大写的字符串
  3. 与较低的情况下更换大写字母
  4. 下壳体在端部的整个字符串(应该是冗余的)

不幸的是,我想不出一个模拟的该会的工作方式相同的数字。

这里是到具有代码功能的网站的链接http://www.dbforums.com/microsoft-sql-server/1216565-oracle-translate-function-equivalent-sql-server.html 。 在甲骨文的等效函数被调用翻译。



Answer 3:

Replace()函数简单地执行操作,并返回。 不保持状态到下一个Replace() 这并不妨碍以后的调用从替换先前替换的字符。 为了周期人物身边,你必须有一个额外的“占位”的值,然后小心不能替代已经从别的更改字符。

首先,让我告诉你一个比喻:

有三个桶满同等数量的弹珠的。 水桶被标为 “A”, “B” 和 “C”。 您必须执行以下操作:

  • 从倒A的所有弹珠到C.
  • 倒入所有弹珠的B到A.
  • 从倒C中的所有弹珠到B.

你会得到什么结果呢? 答案是:空桶C,和具有两倍乙弹子的数量如在A.

如果您想保留原来的数弹珠,你必须有四个容器,以便在移动的,你不混弹珠:

  • 倒入所有弹珠由C到X.
  • 从倒A的所有弹珠到C.
  • 倒入所有弹珠的B到A.
  • 从倒X中的所有弹珠到B.(而不是由C - 它已经具备了的弹珠)

现在你有你所期望的结果,并可以抛弃空桶X.

试试这个表情,看看它给你想要的东西:

Replace(Replace(Replace(Replace('c', char(1)), 'a', 'c'), 'b', 'a'), char(1), 'b')


文章来源: SQL Server : how does the Replace function work as its acting strange for me