Отображать только столбцы двух разных операторов выбора, содержащих одну строку?

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

До сих пор я пытался использовать intersect, но, похоже, это не то, что я хочу.

select 'ABC' as test, 'DEF' as test2, '123' as test3

select 'ABC2' as test, 'DEF' as test2, '124' as test3

Сравнение обоих отобразит строку, в которой будут различия

Результатом будут столбцы с разными значениями в виде строки. В этом случае:

"'test': 'ABC', 'test3': '123'"

Оператор SELECT должен быть хорошо определен, поэтому он не может иметь неизвестное количество столбцов. В вашем примере они явно имеют 2 столбца и могут возвращать только 2 столбца.

Larnu 03.01.2023 00:55

Нет неизвестного количества столбцов, а есть фиксированное число, но оба столбца всегда будут иметь одинаковое количество столбцов.

apolloSN 03.01.2023 01:02

Так что именно вы здесь спрашиваете? Каковы ваши ожидаемые результаты двух вышеуказанных запросов?

Larnu 03.01.2023 01:03

Он отобразит один столбец с именем test и значение ABC. это все разные значения

apolloSN 03.01.2023 01:10

Пожалуйста, отредактируйте вопрос и включите ожидаемое.

The Impaler 03.01.2023 01:13

Пожалуйста, объясните логику, почему отображается только первое значение? И если вам нужно только первое значение, просто выберите первое значение и удалите второй выбор.

Dale K 03.01.2023 01:32

Я пытаюсь сравнить оба оператора select, чтобы получить разные значения. потому что «ABC» != «ABC2» в тесте столбца это отобразится. но 'DEF' - это то же значение в test2

apolloSN 03.01.2023 01:34
SELECT 'ABC' AS test EXCEPT SELECT 'ABC2' AS test;?
Larnu 03.01.2023 01:37

Однако, как уже было сказано, вы должны возвращать статическое количество столбцов, поэтому, если вы хотите сравнить 2 столбца, вы всегда должны возвращать 2 столбца.

Dale K 03.01.2023 01:38

Но мне нужно проверить и test2. выберите «ABC» в качестве теста, «DEF» в качестве теста2, ЗА ИСКЛЮЧЕНИЕМ выбора «ABC2» в качестве теста, «DEF» в качестве теста2 по-прежнему возвращает DEF

apolloSN 03.01.2023 01:38

И ваш сценарий кажется немного упрощенным, есть ли только 2 строки? И вы всегда хотите значение из первой строки, если оно отличается от значения во второй строке?

Dale K 03.01.2023 01:39

Чтобы сравнить 2 столбца, вам нужно будет что-то вернуть для второго столбца, даже если он нулевой.

Dale K 03.01.2023 01:40

Будет около 10+ столбцов, которые нужно будет сравнить

apolloSN 03.01.2023 01:41

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

Dale K 03.01.2023 01:42

Как уже было сказано, вы не можете вернуть переменное количество столбцов, если вы сравниваете 11 столбцов, вам нужно 11 столбцов в ваших результатах или один столбец со значениями, разделенными запятыми - может быть, это то, что вы имеете в виду?

Dale K 03.01.2023 01:53

хорошо, поскольку это не могут быть столбцы, я сделаю это строкой

apolloSN 03.01.2023 02:03
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
17
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте набор выражений case, чтобы сравнить каждый столбец и вывести значение, если оно отличается, например.

select
  case when a.test1 <> b.test1 then 'test1:' + a.test1 else '' end
  + case when a.test2 <> b.test2 then ', test2:' + a.test2 else '' end
  + case when a.test3 <> b.test3 then ', test3:' + a.test3 else '' end
from (
    select 'ABC' as test1, 'DEF' as test2, '123' as test3
) a
cross join (
  select 'ABC2' as test1, 'DEF' as test2, '124' as test3
) b;

Возвращает:

Результат тест1:ABC, тест3:123

Это выполнить работу. Я нахожу это довольно медленным, с 15 случаями это занимает около 3-5 секунд.

apolloSN 03.01.2023 06:49

Это зависит от индексов, которые у вас есть на вашем столе...

Dale K 03.01.2023 06:55

Другие вопросы по теме