Сравнение значений столбца и возврат ERROR или OK - PullRequest
0 голосов
/ 09 февраля 2020

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

У меня есть следующие примеры данных, где все они должны быть в порядке, но они отображаются как ОШИБКА. Кто-нибудь знает способ сделать сравнение, которое приведет к ОК для всех для ниже?

CREATE TABLE #testdata (
    ID INT
    ,ValueSource VARCHAR(800)
    ,ValueDestination VARCHAR(800)
    ,Value_Varchar_Check AS (
        CASE 
            WHEN coalesce(ValueSource, '0') = coalesce(ValueDestination, '0')
                THEN 'OK'
            ELSE 'ERROR'
            END
        )
    )

INSERT INTO #testdata (
    ID
    ,ValueSource
    ,ValueDestination
    )
SELECT 1
    ,'hepatitis c,other (specify)' 'hepatitis c, other (specify)'    
UNION ALL    
SELECT 2
    ,'lung problems / asthma,lung problems / asthma'
    ,'lung problems / asthma'    
UNION ALL    
SELECT 3
    ,'lung problems / asthma,diabetes'
    ,'diabetes, lung problems / asthma'    
UNION ALL    
SELECT 4
    ,'seizures/epilepsy,hepatitis c,seizures/epilepsy'
    ,'hepatitis c, seizures/epilepsy'

1 Ответ

2 голосов
/ 09 февраля 2020

Я не думаю, что вы можете написать это как сгенерированный столбец, так как это довольно сложно вычислить. Если вы используете 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...