如何编写一个 SQL 查询,其 where 子句包含在另一个查询中?
How do I write an SQL query whose where clause is contained in another query?
我有两张表,一张用于客户,一张用于项目。
在 Customer 中,我有一个名为 "preference" 的列,它存储了一个硬标准列表,表示为 SQL 中的 WHERE
子句,例如"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 但我一直无法弄清楚我应该如何做到这一点。
我正在使用 PostgreSQL 9.5.1
我假设偏好与我编造的 item_id 列相同。您可能需要调整它以适合您的情况。对于像这样的未来问题,向我们提供您正在使用的 table 结构可能会有所帮助,它确实帮助了我们!
你要的是一个子查询:
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
我决定改为更改我的模式,因为以这种方式将条件存储在首选项中变得非常混乱。
我限制了可以指定的偏好类型,然后将它们存储为 Customer 中的列。
之后,我想要的所有查询都可以表示为连接。
我有两张表,一张用于客户,一张用于项目。
在 Customer 中,我有一个名为 "preference" 的列,它存储了一个硬标准列表,表示为 SQL 中的 WHERE
子句,例如"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 但我一直无法弄清楚我应该如何做到这一点。
我正在使用 PostgreSQL 9.5.1
我假设偏好与我编造的 item_id 列相同。您可能需要调整它以适合您的情况。对于像这样的未来问题,向我们提供您正在使用的 table 结构可能会有所帮助,它确实帮助了我们!
你要的是一个子查询:
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
我决定改为更改我的模式,因为以这种方式将条件存储在首选项中变得非常混乱。
我限制了可以指定的偏好类型,然后将它们存储为 Customer 中的列。
之后,我想要的所有查询都可以表示为连接。