2015-01-29 4 views
0

Я новичок как для stackoverflow, так и для SQL, поэтому я надеюсь на ваше понимание! Недавно я столкнулся со многими проблемами SQL, и я надеюсь, что помощь мне может помочь. Это потому, что я попытался найти информацию, некоторые ответили на мои проблемы, но после этого у меня появилось больше проблем. Во-первых, я видел последнее сообщение пользователя javascriptstress в его замене значений в столбце. В моей проблеме я работал над деталями кредитных карт в SQL, в результате чего мне пришлось подвергать цензуре цифры на значениях кредитной карты пользователя, что покажет результат xxxxxxxxxxxx2345 вместо «2734948533562345» для карты Visa. Однако, используя SUBSTRING и LEN, я не могу скрыть значения. Из-за того, что не все кредитные карты имеют 16 цифр, я столкнулся с проблемой предоставления только четырех последних цифр номера кредитной карты. Конечно, это возможно, если я буду кодировать каждый номер кредитной карты один за другим, но что, если мне нужно скрыть первые 12 номеров для многих кредитных карт? Есть ли более удобный способ разрешения этого?SQL Замена значений и выбор выражений выписки

Помощь очень ценится!

Ps. Я вроде новой технологии, я извиняюсь за любые проблемы вызвали :(

+0

Pss. Я работаю над SQL Server 2008, мне плохо. –

+1

Немного непонятно, каков ваш желаемый результат. Вы хотите замаскировать первые 12 цифр и показать остальное независимо от длины, или вы хотите всегда показывать 4 цифры и маскировать все до последних четырех? – jpw

+0

Я хочу всегда показывать последние 4 цифры и маскировать первые несколько цифр. Потому что не все кредитные карты имеют 16 цифр, некоторые из них имеют 15 цифр, поэтому я хотел бы только показать последние 4 цифры –

ответ

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) 

Но я бы предложил использовать мистер Гиббс версию, как он с помощью функции RIGHT упростить его даже Больше.

+0

Я не узнал до степени использования репликации, я думаю, это слишком сложно для меня ... –

+0

@Nonononosir Это просто фантастический способ MS сказать «Повторить». Он просто повторяет символ, указанный в качестве первого аргумента столько раз, сколько указано во втором. :) – TZHX

1

Если вы запрашиваете:

SELECT REPLICATE('x', LEN(ccnumber) - 4) + RIGHT(ccnumber, 4)) 
FROM ... 
  • REPLICATE повторяет строковое п раз.
  • RIGHT принимает n самые правые символы из строки.

Для SQL 2012 вперед, я бы рекомендовал более безопасное CONCAT собрать строку:

SELECT 
    CONCAT(
    REPLICATE('x', LEN(ccnumber) - 4), 
    RIGHT(ccnumber, 4)) 
FROM ... 
  • CONCAT Объединяет две строки; оператор + также делает это, но CONCAT никогда не будет рассматривать значения как числа и попытаться их добавить.
+1

'concat' был представлен в 2012 году, если память мне помогает, поэтому вам придется делать конкатенацию старомодным способом. – jpw

+0

Хороший улов - я пропустил этот тег «2008». Я исправлю. –

Смежные вопросы