Oracle通过动态where子句自我连接

时间:2019-07-18 01:59:54

标签: oracle oracle12c self-join where-in

使用表上的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;

预期:

  1. 如果P.AVAILABLE = 1,则显示具有匹配product_id的给定主键的所有记录(即(1,0)中的P.AVAILABLE)。

  2. 如果P.AVAILABLE = 0,则仅显示具有匹配product_id的给定主键的匹配记录(即P.AVAILABLE = 0)。

Expected Result Snaphsot

实际:

  1. 在主键上进行选择时显示所有记录,其中可用= 0,如下快照所示。
  2. 当给定具有匹配product_id的主键的查询可用= 1时,查询工作正常。

预先感谢

Attached snaphost

1 个答案:

答案 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;

结果:Filtered Records

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;

结果:Filtered Records snapshot