2013-11-13 2 views
0

Может ли кто-нибудь, пожалуйста, сообщить мне, может ли быть реализован следующий сценарий в SQL Server?SQL String Манипуляции из значения таблицы

Сценарий: Есть Фамилия в таблице, и которые имеют Фамилии, как,

Смитом MD

ДЖОРДЖ MD PHD

SMITH MD ООО

SMTITH JR MD

SMITH III MD PA

SMITH * , MD *

Другими словами, фамилия много названий или суффикс. Я хочу очистить эти данные с помощью SQL. В настоящее время я делаю это во множестве просмотров, например, сначала удаляю только MD, а затем в следующем представлении LLC или JR и так далее.

Здесь мой вопрос: Могу ли я удалить весь этот возможный суффикс/заголовок в таблицу, кроме фамилии, и снова проверить фамилию за этой таблицей, если это удержание с фамилией, тогда я могу удалить это из фамилии.

Что-то подобное,

LOCATE(a.LastName, IN (Select Suffix/Title from Code table))>0 

Тогда Удалить всю эту жала снова глядя на таблицу кодов ** Ex:. Таблица

Last name is like SMITH MD 

коды будут иметь 2 колонки, как

Code Logic 
MD SUBSTRING(a.LastName,1,length(a.NEWlastname)-2) 

удалить этот MD для фамилии и сбросить очищенные данные в отдельной таблице. Поэтому я могу использовать данные из этой новой таблицы для дальнейшей обработки.

Пожалуйста, сообщите мне об этом.

Спасибо.

+0

Попытка выполнить очистку данных с использованием чистых звуков SQL несчастна. У SSIS есть некоторые возможности здесь: [Clicky!] (Http://msdn.microsoft.com/en-us/magazine/cc163731.aspx) – Andrew

ответ

0

Кажется, что вам нужна только последняя фамилия. Фамилия всегда сопровождается пробелом. Вы можете использовать это пространство, чтобы определить конец последнего имени и избегать всего, что следует:

SELECT DISTINCT YT.USER_NAME, 
       SUBSTR(YT.USER_NAME, 0, INSTR(YT.USER_NAME, ' ') - 1) AS ONLY_NAME 
    FROM YOUR_TABLE YT 

Надеется, что это помогает

+1

Это решение не работает во всех случаях. OP показывает случай в своих данных примера (последняя строка, которая, кажется, не отформатирована правильно), которая не имеет места, просто запятая. Он также не позволяет использовать Last Names, в которых есть пробел. Кроме того, INSTR не является функцией SQL Server. –

0

При использовании функции CLR на основе варианты для вас, то вы можете использовать обычный Выражение для простого удаления одного или нескольких соответствующих суффиксов. Замена RegEx может соответствовать любому количеству суффиксов в одном вызове (используя канал «|» для «или» суффиксы) и заменить каждую пустую строку. Регулярные выражения позволяют легко совместить комбинацию символов, которые предшествуют каждому суффиксу: пробел, запятая (две в ваших данных примера), а также запятая, а затем пробел или даже пробел плюс запятая плюс пробел. И этот подход позволяет содержать имена в именах.Вы можете заполнить таблицу суффиксов (как вы просили), но нет необходимости хранить логику для удаления суффикса.

В следующем примере используется библиотека SQL#, которая включает функцию RegEx_Replace. Я автор SQL #, но эта функция находится в бесплатной версии. Или, если вам просто нужна функция RegEx Replace без всех других функций, есть многочисленные примеры на разных форумах/блогах/статьях/и т. Д.

В примере я включил два дополнительных тестовых примера: один с запятой и пробелом (чтобы показать, что оба они удалены), и тот, который не определен как суффикс (чтобы показать, что пространство до него не удалено).

DECLARE @TestNames TABLE (LastName NVARCHAR(50)) 
INSERT INTO @TestNames VALUES 
     ('SMITH MD'), 
     ('GEORGE MD PHD'), 
     ('SMITH MD LLC'), 
     ('SMTITH JR MD'), 
     ('SMITH III MD PA'), 
     ('SMITH,MD'), 
     ('SMITH, IV'), 
     ('SMITH NotDefined') 

DECLARE @NameSuffixes TABLE (Suffix NVARCHAR(50)) 
INSERT INTO @NameSuffixes VALUES 
     ('MD'), 
     ('PHD'), 
     ('llc'), 
     ('II'), 
     ('III'), 
     ('iv'), 
     ('jr'), 
     ('pa') 

-- Pattern = 
-- (([, ]+MD\b)|([, ]+PHD\b)|([, ]+llc\b)|([, ]+II\b)|([, ]+III\b)|...) 
DECLARE @SuffixList NVARCHAR(4000) = N'(' 
SELECT @SuffixList += N'([, ]+' + Suffix + N'\b)|' 
FROM @NameSuffixes 
SET @SuffixList += N')' 

SELECT tn.LastName, 
    SQL#.RegEx_Replace(tn.LastName, @SuffixList, '', -1, 1, N'IgnoreCase') + N'~' 
FROM @TestNames tn 

Пожалуйста, обратите внимание, что «~» добавляется к каждому отфильтрованное значение только, чтобы показать, что нет никаких завершающих пробелов.

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