2015-12-03 4 views
0

Есть ли способ ВЫБРАТЬ первый и последний 2 символа и ЗАМЕНИТЬ все остальные символы *, как показано ниже?SQL-сервер: Заменить, кроме первого и последнего символов

WA***RT 
EX*** ***IL 
CH***ON 
BE******* *****AY 
AP*LE 

Заранее благодарен!

+0

Но вы хотите сохранить пространство? – jarlh

+1

Возможный дубликат [Заменить все символы строки на звездочки, кроме первых символов и пробела в MSSQL] (http://stackoverflow.com/questions/22193228/replace-all-characters-of-string-to-asterisks-except-first -characters-and-space) –

+0

Я хотел бы оставить пространство, если возможно – YoUwRonG

ответ

2

Пробелы пропущено:

SELECT 
name, 
[hidden] = CASE WHEN LEN(name) <= 4 THEN name 
       ELSE CONCAT(LEFT(name, 2),REPLICATE('*', LEN(name)- 2),RIGHT(name,2)) 
      END 
FROM #tab; 

Если вам нужны пробелы и есть только один вы можете использовать:

SELECT name, 
[hidden] = CASE 
       WHEN LEN(name) <= 4 THEN name 
       WHEN CHARINDEX(' ', name) > 0 
       THEN STUFF(CONCAT(LEFT(name, 2),REPLICATE('*', LEN(name) - 2) , 
         RIGHT(name,2)), CHARINDEX(' ', name),1, ' ') 
       ELSE CONCAT(LEFT(name, 2),REPLICATE('*', LEN(name) - 2) ,RIGHT(name,2)) 
      END 
FROM #tab; 

LiveDemo

Если вы используете версию ниже чем SQL Server 2012 строка конкатенации с +.

+1

Удивительная ссылка для LiveDemo. Я обязательно буду использовать это в будущем! –

+0

На всякий случай кто-то видит это и думает скопировать + вставить, не проверяя его, 'LEN (name) - 4)', а не 'LEN (name) - 2)' (в настоящее время он добавляет дополнительную пару * s) –

0

Вы можете использовать STUFF.

SELECT STUFF(col, 3, LEN(col)-4, REPLICATE('*',LEN(col)-4)) 

Это не сохраняет пробелы.

Чтобы сохранить N пространства, вы можете просто "добавить обратно пространства" с STUFF снова:

SELECT col, 
masked = 
    coalesce(
    -- handle 2 spaces 
    STUFF(STUFF(
     STUFF(col, 3, LEN(col)-4, REPLICATE('*',LEN(col)-4)), 
    CHARINDEX(' ', col), 1, ' '), 
    CHARINDEX(' ', col, CHARINDEX(' ', col)+1), 1, ' '), 
    -- handle 1 spaces 
    STUFF(
     STUFF(col, 3, LEN(col)-4, REPLICATE('*',LEN(col)-4)), 
    CHARINDEX(' ', col), 1, ' '), 
    -- normal masking 
    STUFF(col, 3, LEN(col)-4, REPLICATE('*',LEN(col)-4)), 
    -- too short to mask 
    col 
    ) 

Demo

0
select left(col, 2) + REPLICATE('*',len(col)-4) + right(col,2) from table; 
Смежные вопросы