Как создать новый столбец в предложении SELECT и динамически заполнить его строкой / списком, выполнив concat всех удовлетворенных операторов условия? - PullRequest
0 голосов
/ 08 мая 2019

Итак, в базе данных есть две таблицы. Я должен выяснить, какие строки имеют расхождения в зависимости от определенных условий (в некоторых случаях это просто проверка равенства между полями). Я сообщаю ID этих строк.

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

Основная идея - добавить все несоответствия в другой столбец.

Я посмотрел несколько SO вопросов, но они не совсем подходят для моего случая использования. Так что теперь я думаю, что это невозможно с SQL.

Я искал в Google «ввести динамические значения столбца на основе условий sql» и нажал: Условные данные столбца SQL возвращаются в операторе выбора : добавляется статический столбец

Я также узнал, что можно добавить еще один столбец в SELECT с таким динамическим содержимым:

SELECT id, CASE 
WHEN columnname "DEF" then "I" ELSE "YOU" newColumnName
FROM tableName

Но мне не удалось найти динамическое присвоение значения столбца и обновить SQL. В этом проблема.

Ожидаемые результаты:

  1. Я просто хочу иметь возможность объединять все "строки" падежей, к которым применима запись.
  2. Сделайте это с двумя таблицами.

Итак, поскольку у меня есть две таблицы для работы, я должен поместить эти условия в подпункт WHERE, а не в SELECT.

Итак, если для ID = 345 столбец "FOO_MAN" не совпадает между двумя таблицами, а столбец "BAR_TOO" также не совпадает между двумя таблицами, тогда?

Тогда я хочу, чтобы мое предложение select захватывало такую ​​информацию:

ID      | REASON
345     | FOO_MAN BAR_TWO

1 Ответ

2 голосов
/ 08 мая 2019

Вероятно, проще создать этот тип запроса динамически (например, с помощью хранимой процедуры) на основе условий, которые вы хотите протестировать, но вот небольшой пример, который показывает, как это можно сделать:

SELECT t1.id,
       CONCAT_WS(' ',
                 CASE WHEN t1.foo != t2.foo THEN 'foo' END,
                 CASE WHEN t1.bar != t2.bar THEN 'bar' END
                 ) AS reason
FROM t1
JOIN t2 ON t2.id = t1.id
WHERE t1.foo != t2.foo OR t1.bar != t2.bar

Вывод (для моей демонстрации на dbfiddle )

id  reason
2   foo
4   bar
5   foo bar
...