替换sql中的子字符串

gzjq41n4  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(316)

我试图屏蔽某个字符串,以便只有最后4个字符可见,其余字符被屏蔽。
我在sql server中尝试了以下代码。

select REPLACE(trans_no,substring(trans_no,1,len(trans_no)-4),'*') from uvi_generalledgerwf where trans_no = '11043770'

实际结果-3770
然而,我的预期结果应该是
***3770
此交易编号的长度可能不同,但右起的最后4位数字应始终可见。

nzk0hqpo

nzk0hqpo1#

我认为最简单的方法是:

select concat(replicate('*', len(trans_no) - 4), right(trans_no, 4))
from uvi_generalledgerwf
where trans_no = '11043770';

关键是 replicate() 退货 NULL 当值为负值时——所以没有问题。 concat() 忽略 NULL 值,以便正确处理短字符串。
下面是一个db<>小提琴,展示了它如何处理不同的字符串长度。

jexiocij

jexiocij2#

下面是一个针对sql server的解决方案,但是它应该可以跨几乎所有数据库工作:

SELECT
    trans_no,
    SUBSTRING('**********', 1, LEN(trans_no) - 4) +
        SUBSTRING(trans_no, LEN(trans_no) - 3, 4) AS trans_no_masked
FROM uvi_generalledgerwf
WHERE
   trans_no = '11043770';

演示

这里的策略是简单地连接正确的 * 从静态字符串以及 trans_no . 支持 trans_no 对于更高的长度,请使用一个更大的字符串文字,并具有足够的长度 * 在里面。

rekjcdws

rekjcdws3#

当事务不是固定长度时,此解决方案有效。

DECLARE @trans_no CHAR ( 255 );

SET @trans_no = '0808683370';
SELECT
    CONCAT(
REPLICATE
    ( '*', LEN( @trans_no ) - 4 ),
    SUBSTRING( @trans_no, CASE WHEN   LEN( @trans_no ) > 3 THEN  LEN( @trans_no ) - 3 ELSE  1  END, LEN(@trans_no) ) 
    )

你可以在这里测试https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=974fe247ef4a9ea2ded5e84abb74d0ff
然后在实际应用中,您可以按如下方式使用它:

SELECT
    CONCAT(
    REPLICATE ( '*', LEN ( trans_no ) - 4 ),
    SUBSTRING( trans_no, CASE WHEN LEN ( trans_no ) > 3 THEN LEN ( trans_no ) - 3 ELSE 1 END, LEN ( trans_no ) ) 
    ) as masked_trx_no
FROM
    uvi_generalledgerwf 
WHERE
    trans_no = '11043770'

相关问题