Sql-запрос для сравнения отдельных значений в столбце со строкой с разделителями
Всем Привет,
У меня есть 2 колонки.
Текущее значение
MasterListOfValues
MasterListOfValues - это '
;
'с разделителями.например значений:- A;B;C;D
Таблица выглядит так:-
current value MasterListofvalue A Aa;B;C;D B A;B;C;D C A;B;C;D
Теперь для каждого совпадения мы должны сделать еще один столбец с точным совпадением и поместить туда это значение , а если точного совпадения нет, то мы должны создать еще один столбец с аналогичным совпадением.
Выходные данные должны выглядеть следующим образом:-
current value MasterListofvalue Exact Match Similar Match A Aa;B;C;D N/A B A;B;C;D B C A;B;C;D C
Пожалуйста, сообщите об этом.
Что я уже пробовал:
Я попытался создать функцию разделения, но не смог получить желаемый результат.
CHill60
Вы должны показать нам код, который не сработал. Кроме того, ваше объяснение не очень понятно. Вы также должны избегать хранения разделенных значений в столбце - это плохой дизайн.
Попробуйте лучше объяснить свою проблему - например, я не понимаю, почему B и C имеют "похожее совпадение", а A-нет. Четко сформулируйте правила.
chints786
Привет,
B и C-это аналогичное совпадение, потому что они являются одним из значений в столбце MasterListof Values. По отношению к A MasterListValue состоит из Aa, следовательно, это не идеальное совпадение, но оно должно быть под аналогичным совпадением, и значение там должно быть A.
Вот эта функция :-
Создайте функцию [dbo].[SplitString]
(
@List NVARCHAR(макс.),
@Delimiter NVARCHAR(255)
)
ТАБЛИЦА ВОЗВРАТОВ
С SCHEMABINDING КАК
ВЕРНУТЬ
С Е1(Н) Как ( выбрать 1 объединить все выбрать 1 объединить все выбрать 1 объединить все выбрать 1
ВСЕСОЮЗНАЯ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1
ВСЕСОЮЗНАЯ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1),
E2(N) AS (выберите 1 из E1 a, E1 b),
E4(N) AS (выберите 1 из E2 a, E2 b),
E42(N) AS (выберите 1 из E4 a, E2 b),
cteTally(Н) Как (выберите 0 объединить все выбрать первые (DATALENGTH(функция isnull(@список,1)))
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E42),
cteStart(N1) AS (SELECT t.N+1 FROM cteTally t
Где (подстрока(@List,t.N,1) = @Delimiter или t.N = 0))
Выберите пункт = подстрока(@список, ы.Н1, функция isnull(null, если(функция charindex(@разделитель,@список,ы.Н1),0)-с.Н1,8000))
От cteStart s;
ГО
перекрестное применение с таблицей данных я бы получил разделенные значения столбца Msater одно под другим, чтобы получить точное совпадение.