агрегация больших двоичных объектов

#sql #oracle11g

#sql #oracle11g

Вопрос:

У меня есть таблица:

 create table example (id number, image varchar2(10));
  

С 2 строками:

 insert into example (24, 'pippo');
insert into example (35,'pluto');
  

Запрос:

 select max(case when id=24 then image end) as col1,
       max(case when id=35 then image end) as col2
from example;
  

Это отлично работает со столбцом «image» как varchar2! Проблема в том, что столбец является большим двоичным объектом.

Как я могу получить тот же результат?

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

Комментарии:

1. Является ли идентификатор уникальным? Если это так, я полагаю, вы могли бы использовать 28 выражений подзапроса. Но кто / что будет вызывать это и использовать результаты — действительно ли они нужны как столбцы, а не строки? И будет ли меняться количество изображений (и, следовательно, столбцов)?

2. Итак, какие данные хранятся в столбцах больших двоичных объектов? Если это текст (возможно, очень длинный), почему это BLOB, а не CLOB? И если это должен быть CLOB, можете ли вы сначала это исправить?

3. Большое спасибо @a_horse_with_no_name за редактирование вопроса. Я не заметил, что это было написано плохо.

4. @AlexPoole идентификатор уникален, НО я не могу выполнить 28 подзапросов.. Это приведет к снижению производительности. Кроме того, мне нужен столбец 28, а не строки. Да, возможно, в будущем количество изображений / столбцов может измениться

5. @mathguy в столбцах больших двоичных объектов есть изображения.

Ответ №1:

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

В любом случае, вы можете использовать предложение Алекса о наличии 28 выражений подзапроса. Если вас беспокоит производительность, вы можете сначала выбрать в CTE (предложение WITH), результирующий набор которого будет содержать всего 28 строк, а затем записать выражения подзапроса для CTE. Что-то вроде этого:

 with prep ( id, blob_col ) as (
       select id, blob_col from base_table where id in (24, 35, ... )
     )
select
  (select blob_col from prep where id = 24) as col_1,
  (select blob_col from prep where id = 35) as col_2,
  ...
from dual
;
  

Комментарии:

1. Он должен использоваться веб-приложением, которое принимает имя столбца и значение (изображение) и заменяет его в документе docx, где есть теги, идентифицируемые именами столбцов (поэтому мне нужно значение столбца соответствия один к одному). Почему вы говорите, что эти 28 запросов не влияют на производительность? Я думал, что 28 вызовов одной и той же таблицы были дорогостоящими…

2. 28 вызовов к очень большой таблице стоят очень дорого. Решение считывает вашу очень большую базовую таблицу только один раз, чтобы создать CTE (встроенное представление, подзапрос, как бы вы его ни называли). 28 вызовов относятся только к этому подзапросу, результирующий набор которого содержит всего 28 строк. 28 вызовов встроенного представления, содержащего всего 28 строк, совсем не дороги.

3. Причина «столбцов» все еще не ясна. Веб-приложение написано неправильно; соответствие 1-1 существует просто отлично в таблице, где соответствие находится в строках. Но если это означает изменение приложения… Я не собираюсь вдаваться в подробности.

4. я тоже .. я не знаю java или любого другого языка.. Я пытаюсь упростить ситуацию: они говорят мне, что им нужно значение для каждого «тега» (он же конкретная строка в docx). Существует 900 тегов, поэтому я пытаюсь сгруппировать их и как можно меньше опрашивать базу данных (они хотели выполнить запрос для каждого тега !!) но я сталкиваюсь с типом больших двоичных объектов, и с ним довольно сложно взаимодействовать…