I was trying to mask the string by using STUFF function in SQL.
DECLARE @String VARCHAR(20)='TEST12346',
@Start INT = 3,
@Length INT = 3;
SELECT @String AS MyString,
STUFF(@String, @Start, @Length, REPLICATE('*', @Length))
It only works with strings length longer than 5, else it will return NULL.
How to handle the following case?
Expected Result
| MyString | Expected Result | Output |
|---|---|---|
| TE | TE | NULL |
| TES | TE* | NULL |
| TEST | TE** | NULL |
| TESTI | TE*** | TE*** |
| TESTIN | TE***N | TE***N |
CodePudding user response:
Regarding the iif(LEN(@String) > @Length 2, @Length, LEN(@String) - 2 ) :
If for example the length of string is 3 THEN REPLICATE param should be LEN(@String) - 2 = 1 not 3
And if length of string is higher than 5 then REPLICATE param should be 3
DECLARE @String VARCHAR(20)='TESTII',
@Start INT = 3,
@Length INT = 3;
SELECT @String AS MyString,
iif(LEN(@String) >= 3,
STUFF(@String, @Start , @Length, REPLICATE( '*', iif(LEN(@String) > @Length 2, @Length, LEN(@String) - 2 ) ) ),
STUFF(@String, @Start - 1, 0, REPLICATE( '*', 0 ) )
)
CodePudding user response:
You could build the entire String as if it was long enough for all the '*'-characters. Then wrap the result in a LEFT-function and only return the desired output.
SELECT LEFT( SUBSTRING(String, 0, @Start)
REPLICATE('*',@Length)
SUBSTRING(String, @Start @Length, LEN(@String))
, LEN(String))
FROM (VALUES ('TE'), ('TES'), ('TEST'), ('TESTI'), ('TESTIN'), ('TEST12346'))t(String)
