SQL替换值和&选择陈述问题

时间:2015-01-29 13:50:04

标签: sql-server sql-server-2008 substring

我是stackoverflow和SQL的新手,所以我希望你理解!最近我遇到了很多SQL问题,我希望可以提供一些帮助来帮助我。这是因为我尝试过采购信息,有些确实回答了我的问题,但之后给了我更多的问题。 首先,我看到用户javascriptstress最近发布的一篇帖子,用于替换列中的值。在我的问题中,我正在研究SQL中的信用卡详细信息,我必须审查用户信用卡值的数字,这将显示 xxxxxxxxxxxx2345 的结果,而不是Visa卡的“2734948533562345”。但是,通过使用SUBSTRING和LEN,我无法隐藏值。由于并非所有信用卡都有16位数字,我遇到的问题是只提供信用卡号码的最后4位数字。如果我逐个编码每个信用卡号码肯定是可能的,但如果我必须隐藏许多信用卡的前12个号码怎么办?有没有更方便的解决方法?

非常感谢帮助!

聚苯乙烯。我对技术很陌生,对于造成的任何问题我很抱歉:(

2 个答案:

答案 0 :(得分:1)

您可以根据字符串的长度动态确定剪切字符串的位置,然后使用REPLICATE填充正确的数量。

DECLARE @cc VARCHAR(16) = '1234123412341234'
DECLARE @len INT
SELECT @len = LEN(@cc)
DECLARE @ss VARCHAR(4) 
SELECT @ss =  SUBSTRING(@cc, LEN(@cc)-3, 4)
SELECT REPLICATE('X', @len-4) + @ss

输出:

  

XXXXXXXXXXXX1234

这显然不是符合PCI标准的处理信用卡数据的方式。

您可以将这些语句链接在一起,以便在更大的SELECT语句中使用它们。您甚至可以定义一个scalar valued function,让您无需麻烦地调用它。

稍微更简洁的版本(没有我为了举例而放入的变量声明):

SELECT REPLICATE('X', LEN(@cc)-4) + SUBSTRING(@cc, LEN(@cc)-3, 4)

但我建议使用Gibbs先生版本,因为它使用RIGHT功能来进一步简化它。

答案 1 :(得分:1)

如果您要查询:

SELECT REPLICATE('x', LEN(ccnumber) - 4) + RIGHT(ccnumber, 4))
FROM ...
  • REPLICATE重复字符串 n 次。
  • RIGHT从字符串中获取 n 最右边的字符。

对于SQL 2012以后,我建议使用更安全的CONCAT来汇编字符串:

SELECT
  CONCAT(
    REPLICATE('x', LEN(ccnumber) - 4),
    RIGHT(ccnumber, 4))
FROM ...
  • CONCAT连接两个字符串; +运算符也执行此操作,但CONCAT永远不会将值视为数字并尝试添加它们。