Можно ли сравнить кортежи в Oracle-совместимых SQL? - PullRequest
9 голосов
/ 24 марта 2011

Я не на 100%, если кортежи - это термин, о котором я говорю, но я смотрю на что-то вроде этого:

Table grades
user    grade
------------
Jim     B
Bill    C
Tim     A
Jim     B+

Я знаю, что могу сделать:

SELECT COUNT(*)
FROM grades
WHERE (
   (user = 'Jim' AND grade = 'B')
   OR (user = 'Tim' AND grade = 'C')
);

Но есть ли способ сделать что-то более похожее на это?

SELECT COUNT(*)
    FROM grades
    WHERE (user, grade) IN (('Jim','B'), ('Tim','C'));

РЕДАКТИРОВАТЬ: В качестве примечания, я бы проверил только:это терпит неудачу, поэтому я предположил, что IN тоже потерпит неудачу, но я ошибся (к счастью!).

Ответы [ 2 ]

17 голосов
/ 24 марта 2011

Отправленный вами запрос должен иметь правильный синтаксис

SQL> ed
Wrote file afiedt.buf

  1  with grades as (
  2    select 'Jim' usr, 'B' grade from dual
  3    union all
  4    select 'Bill', 'C' from dual
  5    union all
  6    select 'Tim', 'A' from dual
  7    union all
  8    select 'Jim', 'B+' from dual
  9  )
 10  select *
 11    from grades
 12   where (usr,grade) in (('Jim','B'),
 13                         ('Tim','C'),
 14*                        ('Tim','A'))
SQL> /

USR  GR
---- --
Jim  B
Tim  A
0 голосов
/ 24 марта 2011

Вы можете использовать подзапрос для обработки списка кортежей как таблицы:

SELECT  COUNT(*)
FROM    grades
JOIN    (
        SELECT  'Jim' as user, 'B' as grade from dual
        UNION ALL
        SELECT  'Tim', 'C' from dual
        UNION ALL
        SELECT  'Pim', 'D' from dual
        ) as SearchTarget
ON      SearchTarget.user = grades.user
        and SearchTarget.grade = grades.grade
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...