Сравнение вложенной строки в SQL Server

#sql #sql-server #tsql

Вопрос:

У меня есть таблица, в которой есть эти столбцы

 a_Max b_Max ------------------------- ,LOG,RF, ,GNB,LOG,SVC ,SVC, ,RF,SVC, ,LOG ,RF,GNB,  

Есть ли простой способ найти и то, и другое a_Max и b_Max поделиться каким-либо именем функции?

итак ,ЖУРНАЛ,RF, amp; ,GNB,ЖУРНАЛ,SVC, общий алгоритм ведения журнала

,SVC, amp; ,RF,SVC, общий алгоритм SVC

,ЖУРНАЛ, amp; ,RF,GNB, общие алгоритмы отсутствуют

 a_Max b_Max ShareAlg ----------------------------------------- ,LOG,RF, ,GNB,LOG,SVC, 1 ,SVC, ,RF,SVC, 1 ,LOG, ,RF,GNB, 0  

Я построил скалярную функцию для сравнения обоих результатов string_split , но это слишком медленно. Интересно, есть ли более быстрый способ

Комментарии:

1. Вам нужно показать нам, что вы уже сделали, чтобы предложить более быстрое решение. Кроме того, если вы предоставляете свои примерные данные в формате DDL DML, людям будет намного проще отвечать.

Ответ №1:

Скалярные функции могут снижать производительность. Если вам необходимо использовать функцию, сначала рассмотрите функцию с табличным значением.

Существуют штрафы за хранение данных с разделителями… РАНО ИЛИ ПОЗДНО ЧТО-ТО ПРИДЕТСЯ АНАЛИЗИРОВАТЬ.

Однако вот вариант, для которого не требуется SVF или TVF.

ПРИМЕЧАНИЕ: Не видя вашей функции, трудно сказать, будет ли она более эффективной.

Пример

 Select *   From YourTable A  Cross Apply ( Select SharAlg = count(*)  from string_split(a_Max,',') B1  Join string_split(b_Max,',') B2 on B1.Value=B2.Value and B1.Valuelt;gt;''  ) B    

Результаты

 a_Max b_Max SharAlg ,LOG,RF, ,GNB,LOG,SVC 1 ,SVC, ,RF,SVC, 1 ,LOG ,RF,GNB, 0