使用表上的oracle self join基于列值动态过滤记录
我一直在尝试通过自我连接来过滤记录,并在where子句中添加了case语句来过滤记录(如果可用== 1,则show_all记录),否则仅显示不可用的记录,即可用== 0。
但是,当P.AVAILABLE = 0时,以下查询不会过滤记录
SELECT P.PRIMARY_KEY,
P.PRODUCT_ID,
P.PRODUCT_VERSION,
P_AVAILABLE
FROM PRODUCT_TABLE P
LEFT JOIN PRODUCT_TABLE PP
ON P.PRODUCT_ID =PP.PRODUCT_ID
WHERE PP.PRODUCT_ID=6057328581
AND P.AVAILABLE IN CASE
WHEN P.AVAILABLE=1 THEN TO_NUMBER(1,0)
ELSE 0
END ORDER BY P.PRODUCT_VERSION DESC;
预期:
如果P.AVAILABLE = 1,则显示具有匹配product_id的给定主键的所有记录(即(1,0)中的P.AVAILABLE)。
如果P.AVAILABLE = 0,则仅显示具有匹配product_id的给定主键的匹配记录(即P.AVAILABLE = 0)。
实际:
预先感谢
答案 0 :(得分:0)
好的,因为你们中的一些人对这个问题不清楚,所以我将简要介绍一下我能弄清楚的有效查询。
预期结果
假设您有一个表格产品,其中您在下面的列中
1.id(primary_key) 2.product_id 3.product_version 4.availability(boolean)
对于给定的ID(可能具有多个产品版本),我想根据特定ID的可用性标志过滤记录。
例如: 1.检查id = 6057328581可用性为= 0。
SELECT P.PRIMARY_KEY,
P.PRODUCT_ID,
P.PRODUCT_VERSION,
P_AVAILABLE
FROM PRODUCT_TABLE P
LEFT JOIN PRODUCT_TABLE PP
ON P.PRODUCT_ID =PP.PRODUCT_ID
WHERE PP.PRODUCT_ID=6057328581
AND (CASE
WHEN PP.AVAILABLE=1 THEN 1
WHEN P.AVAILABLE=0 THEN 1 ELSE 0
END)=1 ORDER BY P.PRODUCT_VERSION DESC;
2。检查id = 6057316825可用性= 1。
SELECT P.PRIMARY_KEY,
P.PRODUCT_ID,
P.PRODUCT_VERSION,
P_AVAILABLE
FROM PRODUCT_TABLE P
LEFT JOIN PRODUCT_TABLE PP
ON P.PRODUCT_ID =PP.PRODUCT_ID
WHERE PP.PRODUCT_ID=6057316825
AND (CASE
WHEN PP.AVAILABLE=1 THEN 1
WHEN P.AVAILABLE=0 THEN 1 ELSE 0
END)=1 ORDER BY P.PRODUCT_VERSION DESC;