Oracle SQL «мета» запрос для записей, которые имеют конкретные значения столбцов - PullRequest
1 голос
/ 25 ноября 2011

Я бы хотел получить все записи из огромной таблицы, где любой из столбцов number имеет значение больше 0. Какой лучший способ сделать это?

например:.

/* table structure*/
create table sometable (id number, 
                        somestring varchar2(12),
                        some_amount_1 number(17,3),
                        some_amount_2 number(17,3),
                        some_amount_3 number(17,3),
                        ...
                        some_amount_xxx number(17,3));
/* "xxx" > 100, and yeah I did not designed that table structure... */

И я хочу любую строку, где любая из some_amount_n > 0 (еще лучшее решение - это добавить поле в первую очередь, чтобы показать, какие поля больше нуля).

Я знаю, что могу написать это с огромным some_amount_1 > 0 OR some_amount_2 > 0 OR ... блоком (а имена полей с некоторыми case when, но должно ли быть более элегантное решение, не так ли?

Ответы [ 2 ]

3 голосов
/ 25 ноября 2011

Возможные решения:

  1. Нормализовать таблицу. Вы сказали, что вы не можете. Попробуйте убедить тех, кто запрещает такое изменение, объяснив преимущества (производительность, простота написания запросов и т. Д.).

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

  3. Напишите программу (либо на PL / SQL, либо на другом процедурном языке), которая выдаст ужасный запрос OR. (Опять же, печать вместе с элегантной версией)

  4. Добавьте новый столбец, скажем, с именем Any_x_bigger_than_zero, который автоматически заполняется либо 0, либо 1 через триггер (который использует огромное уродливое OR). Тогда вам просто нужно проверить: WHERE Test_x_bigger_than_zero = 1, чтобы увидеть, является ли какая-либо из строк > 0

  5. Подобно предыдущему, но даже лучше, создайте материализованное представление с таким столбцом.

1 голос
/ 25 ноября 2011

Сначала создайте таблицу, чтобы отсортировать данные во что-то более простое для чтения из ... чего-то простого, например, id, column_name, column_value.Вам придется со мной смириться, с тех пор, как я работал в oracle, прошло некоторое время, так что в лучшем случае это тяжелый псевдокод:

Быстрый динамический всплеск SQL ... Вы можете установить переменную в SQLзаявление, а затем выполнить эту переменную.Существуют некоторые угрозы безопасности, и возможно, эта функция отключена в вашей среде ... поэтому убедитесь, что вы можете запустить ее в первую очередь.Объявите переменную, установите переменную «select 1», а затем используйте «execute немедленный» для выполнения sql, хранящегося в вашей переменной.

set var = 'select id, ''some_amount_' || 1  || '', some_amount || 1 || ' from table where some_amount_' || 1  || ' <> 0'

Предполагая, что у меня правильный синтаксис оракула ... (труба добавляется правильно? Я считаю, что 3 одинарные кавычки, так как '' 'должны приводить к единице', когда в переменной тоже, возможно, вам придется пробовать и ошибаться в этой строке, пока у вас не будет установлена ​​переменная var):

select id, 'some_amount_1',some_amount_1
from table
where some_amount_1 <> 0

Это должно выбрать идентификатор и значение в some_amount_1 для каждого идентификатора в вашей базе данных.Вы можете легко превратить это в оператор вставки.

Я предполагаю, что у some_amount_xxx есть верхний предел ... Следующий трюк состоит в том, чтобы зациклить этот гигантский оператор.Еще раз, ужасный псевдокод:

declare sql_string
declare i and set to 1
for i = 1 to xxx (whatever your xxx is)
set sql_string to the first set var statement we made, replacing the '1' with the i var here.
execute sql
increment i
loop

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...