2016-03-01 2 views
0

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

В Customer у меня есть столбец с названием «предпочтение», в котором хранится список жестких критериев, выраженных как предложение WHERE в SQL, например. "item.price<20 and item.category='household'".

Я хотел бы запрос, который работает следующим образом:

SELECT * FROM item WHERE interpret('SELECT preference FROM customer WHERE id = 1') 

Что переводится на это:

SELECT * FROM item WHERE item.price < 20 and item.category = 'household' 

Пример модели данных:

CREATE TABLE customer (
cust_id INT 
preference VARCHAR 
); 

CREATE TABLE item ( 
item_id INT 
price DECIMAL(19,4) 
category VARCHAR 
); 
# Additional columns omitted for brevity 

Я я искал кастинг и динамический SQL, но я не смог понять o как я должен это делать.

Я использую PostgreSQL 9.5.1

ответ

0

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

Я ограничил виды предпочтений, которые могут быть указаны, а затем сохранил их как столбцы в Customer.

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

0

Я буду считать, что предпочтение такой же, как мой составил ITEM_ID колонке. Возможно, вам придется настроить его, чтобы он соответствовал вашему делу. Для будущих вопросов, подобных этому, он может заплатить, чтобы предоставить нам структуры таблиц, с которыми вы работаете, это действительно помогает нам!

То, что вы просите за это подзапрос:

select * 
from item 
where item_id in (select 
        preference 
       from 
        customer 
       where id = 1) 

То, что я хотел бы предложить, хотя это объединение:

select item.* 
from item 
join customer on item.item_id = customer.preference 
where item.price<20 and 
    item.category='household' 
    customer.id = 1 
+0

My 'preference' не имеет ничего общего с' item_id', поэтому первый запрос не будет работать. То же самое с предложением «join on» второго примера. Я хочу, чтобы иметь возможность заменить полное предложение 'where' вашего второго примера на запрос. В то время как подзапросы позволяют использовать отдельные кортежи или столбцы из другого запроса, я хочу заменить все свое предложение 'where', используя строку, сохраненную в другом запросе. Поскольку предложение 'where' будет меняться в зависимости от клиента, и я предполагаю, что он должен быть динамичным, чтобы это работало. –

+0

@PrashanthChandra: Ах, спасибо за разъяснение. Я вижу, чего вы пытаетесь достичь сейчас. Да, динамический SQL мог бы пойти туда, но как это реализовано в PostgreSQL, это немного из-за моей рулевой рубки! – LordBaconPants

Смежные вопросы