Я не думаю, что вы можете написать это как сгенерированный столбец, так как это довольно сложно вычислить. Если вы используете SQL Server 2016 или более позднюю версию, вы можете использовать STRING_SPLIT
, чтобы преобразовать значения ValueSource
и ValueDestination
в таблицы, а затем отсортировать их по алфавиту с помощью запроса, подобного следующему:
SELECT DISTINCT ID, TRIM(value) AS value,
DENSE_RANK() OVER (PARTITION BY ID ORDER BY TRIM(value)) AS rn
FROM testdata
CROSS APPLY STRING_SPLIT(ValueSource, ',')
Для ValueSource
это приводит к:
ID value rn
1 hepatitis c 1
1 other (specify) 2
2 lung problems / asthma 1
3 diabetes 1
3 lung problems / asthma 2
4 hepatitis c 1
4 seizures/epilepsy 2
Затем вы можете FULL OUTER JOIN
эти две таблицы в ID
, value
и rn
и обнаружить ошибку при наличии нулевых значений из с любой стороны (поскольку это означает, что значения для данных ID
и rn
не совпадают):
WITH t1 AS (
SELECT DISTINCT ID, TRIM(value) AS value,
DENSE_RANK() OVER (PARTITION BY ID ORDER BY TRIM(value)) AS rn
FROM testdata
CROSS APPLY STRING_SPLIT(ValueSource, ',')
),
t2 AS (
SELECT DISTINCT ID, TRIM(value) AS value,
DENSE_RANK() OVER (PARTITION BY ID ORDER BY TRIM(value)) AS rn
FROM testdata
CROSS APPLY STRING_SPLIT(ValueDestination, ',')
)
SELECT COALESCE(t1.ID, t2.ID) AS ID,
CASE WHEN COUNT(CASE WHEN t1.value IS NULL OR t2.value IS NULL THEN 1 END) > 0 THEN 'Error'
ELSE 'OK'
END AS Status
FROM t1
FULL OUTER JOIN t2 ON t2.ID = t1.ID AND t2.rn = t1.rn AND t2.value = t1.value
GROUP BY COALESCE(t1.ID, t2.ID)
Вывод (для данных выборки):
ID Status
1 OK
2 OK
3 OK
4 OK
Демонстрация по SQLFiddle
Затем можно использовать весь приведенный выше запрос как CTE
(назовите его t3
), чтобы обновить исходную таблицу:
UPDATE t
SET t.Value_Varchar_Check = t3.Status
FROM testdata t
JOIN t3 ON t.ID = t3.ID
Вывод:
ID ValueSource ValueDestination Value_Varchar_Check
1 hepatitis c,other (specify) hepatitis c, other (specify) OK
2 lung problems / asthma,lung problems / asthma lung problems / asthma OK
3 lung problems / asthma,diabetes diabetes, lung problems / asthma OK
4 seizures/epilepsy,hepatitis c,seizures/epilepsy hepatitis c, seizures/epilepsy OK
Демонстрация по SQLFiddle