字符串SQL SERVER中的掩码字符

时间:2018-05-07 12:11:41

标签: sql sql-server

如何在SQL SERVER中的字符串中替换x和y char之间的字符。 例如,如果我有:TEST123456到最后TE ****** 56。我不知道字符串有多长,但我知道我需要在字符串

中屏蔽x和y之间的字符

4 个答案:

答案 0 :(得分:4)

您可以使用REPLICATE()STUFF()执行此操作:

DECLARE @String VARCHAR(20)='TEST123456',
        @Start INT = 3,
        @End INT = 5;


SELECT
    @String AS MyString,
    STUFF(@String, @Start, @End - @Start, REPLICATE('*', @End - @Start)) AS Mask;

当你说“我不知道字符串会有多长时间”时,REPLICATE()函数会返回“{1}}和{{”的星号“*” {1}}你提供。

答案 1 :(得分:1)

您可以尝试这样的事情

git diff <source_branch> <target_branch> -- file_path

输出

DECLARE @Str VARCHAR(20)='TEST123456',
    @x INT = 3,
    @Y INT = 9


SELECT
    MyString = @Str,
    Mask = STUFF(@Str,@x,@Y-@x,'********')

答案 2 :(得分:1)

使用STUFFREPLICATECHARINDEX的组合。

DECLARE @string VARCHAR(20) = 'TEST123456'

DECLARE @maskStart CHAR = 'S'
DECLARE @maskEnd CHAR = '4'

SELECT
    Original = @string,
    MaskStartIndex = CHARINDEX(@maskStart, @string),
    MaskEndIndex = CHARINDEX(@maskEnd, @string),
    MaskToSet = REPLICATE('*', CHARINDEX(@maskEnd, @string) - CHARINDEX(@maskStart, @string)),
    Replaced = STUFF(
        @string,
        CHARINDEX(@maskStart, @string),
        CHARINDEX(@maskEnd, @string) - CHARINDEX(@maskStart, @string) + 1,
        REPLICATE('*', CHARINDEX(@maskEnd, @string) - CHARINDEX(@maskStart, @string)))
WHERE
    CHARINDEX(@maskStart, @string) > 0 AND
    CHARINDEX(@maskEnd, @string) > CHARINDEX(@maskStart, @string)

CHARINDEX将为您提供另一个字符串中的特定字符串的位置(默认情况下为第一个)。

REPLICATE将重复N次字符串,我们将其用于掩码。

STUFF将替换另一个字符串(原始字符串中的掩码),同时删除指定位置的N个字符。

答案 3 :(得分:0)

我的要求与帖子不同,在这里发布我的解决方案可能会帮助别人。

CREATE FUNCTION [dbo].[uf_MaskText] (@cText VARCHAR(255), @iNumberOfVisibleCharacters INT)
RETURNS VARCHAR(255)
AS

BEGIN
    IF ISNULL(@cText, '') <> ''
    BEGIN
        IF LEN(@cText) > @iNumberOfVisibleCharacters
        BEGIN
            DECLARE @iNumberCharacters INT = LEN(@cText)
            SET @cText = REPLICATE('*', @iNumberCharacters - @iNumberOfVisibleCharacters) + SUBSTRING(@cText, @iNumberCharacters - @iNumberOfVisibleCharacters + 1, @iNumberOfVisibleCharacters)
        END
    END
    RETURN @cText
END
GO