Оценка нескольких диапазонов в предложении Oracle IN

У меня есть выбор Oracle, который выглядит так:

SELECT *
  FROM CUSTOMER
 WHERE (CUSTOMER_TYPE BETWEEN 100 AND 200
     OR CUSTOMER_TYPE = 350
     OR CUSTOMER_TYPE BETWEEN 410 AND 520);

Я хочу изменить его на что-то, что сочетает в себе оценку нескольких диапазонов и отдельных значений в одном выражении. Приведенный ниже синтаксис НЕ ПРАВИЛЬНЫЙ, но есть ли эквивалент Oracle?

SELECT *
  FROM CUSTOMER
 WHERE CUSTOMER_TYPE IN (100..200, 350, 410..520);

person Gregg Feldt    schedule 09.08.2012    source источник
comment
Почему вы хотите это сделать? Что вы хотите получить здесь?   -  person Victor    schedule 09.08.2012
comment
Эммм... Насколько я знаю, вы уже делаете это оптимально. Почему ты хочешь измениться?   -  person Ben    schedule 10.08.2012
comment
Я думаю, что автор хочет иметь в строке как отдельные числа, так и диапазоны чисел, чтобы их можно было прочитать из переменной (или файла).   -  person user11122985    schedule 27.02.2019


Ответы (1)


Рассмотрите это как возможность.

SELECT *
FROM CUSTOMER c,
(
    select level + 99 n from dual connect by level < 102
        union all
    select 350 n from dual
        union all
    select level + 409 n from dual connect by level < 112
) t
WHERE c.CUSTOMER_TYPE = t.n

Он избегает ИЛИ и IN. Если вам повезет, в результате получится хеш-соединение.

person EvilTeach    schedule 09.08.2012
comment
Это одинаково точный способ сделать это, но я не вижу преимущества. Вы по-прежнему выполняете то же сканирование диапазона индекса (при условии, что он проиндексирован), но генерируете диапазон в SQL, а не внутренне, что будет медленнее. - person Ben; 10.08.2012
comment
Я пытаюсь избежать BETWEEN, потому что для этого требуется несколько операторов OR, если я оцениваю непоследовательный диапазон чисел. Я просто хочу знать, есть ли более простой способ "сокращения" для оценки диапазона чисел. Другие языки допускают 100..200 как сокращение от 100 до 200. Мой фактический запрос намного больше со многими операторами BETWEEN/OR. У Dose Oracle есть эквивалентное сокращение для BETWEEN - person Gregg Feldt; 10.08.2012
comment
@GreggFeldt, что бы вы ни делали, как бы вы это ни делали, вам нужны данные из нескольких диапазонов. Это, в свою очередь, означает, что вы должны использовать логическое ИЛИ. Независимо от того, какой язык вы используете, он останется прежним. Почему важен синтаксис? Ваш текущий запрос недостаточно эффективен? - person Ben; 10.08.2012
comment
Дело не в эффективности, а в простоте написания при оценке нескольких диапазонов. Я прихожу к выводу, что мне придется придерживаться МЕЖДУ/ИЛИ. - person Gregg Feldt; 10.08.2012