带有Oracle SQL的WHERE子句中的IF语句

时间:2016-04-21 16:10:06

标签: sql if-statement count oracle-sqldeveloper where

我正在尝试为网站开发PUT方法。我使用以下代码来确保用户输入的信息与我们在更改数据库之前已有的信息不同(同时为了防止一大堆日志文件,以防用户点击提交次数太多次): / p>

    SELECT COUNT(*) AS count
    FROM iam.credential
    WHERE iam.credential.CREDENTIAL_TYPE = :1
    AND iam.credential.CREDENTIAL_NAME   = :2
    AND iam.credential.LOST_OR_STOLEN    = :3 
    AND iam.credential.STATUS            = :4
    AND iam.credential.EXPIRATION_DATE   = :5
    AND iam.credential.ISSUING_LOCATION  = :6 
    AND iam.credential.PHYSICAL_FORM     = :7 
    AND iam.credential.ASSOCIATED_DEVICE = :8
    AND iam.credential.DISPLAY_NAME      = :9;

我从我的网页抓取值,但是当值为NULL时,我遇到了问题。我希望能够做到以下几点:

    SELECT COUNT(*) AS count
    FROM iam.credential
    WHERE 
    IF iam.credential.CREDENTIAL_TYPE is not null THEN
        iam.credential.CREDENTIAL_TYPE = :1
    ELSE
        iam.credential.CREDENTIAL_TYPE is null
    END IF
    AND 
    IF iam.credential.CREDENTIAL_NAME is not null THEN
       iam.credential.CREDENTIAL_NAME    = :2
    ELSE
       iam.credential.CREDENTIAL_NAME    is null
    END IF
    //and so on

我无法使用

    SELECT COUNT(*) AS count
    FROM iam.credential
    WHERE (iam.credential.CREDENTIAL_TYPE = :1
    OR iam.credential.CREDENTIAL_TYPE is null)

因为当我只想要匹配用户输入的那个时,它将返回2的计数。

基本上我希望计数在记录存在或者不存在时返回1或0。

我希望根据用户提供的内容动态更改WHERE子句。

如果用户没有提供值,因为它不是必需的,它将为null。我需要查询才能更改为

    credential_name is null 

因为

    credential_name = null

在oracle中没有工作。

如果它不为null,那么我需要它

   credential_name = :1 

它将填充用户提供的值。

   credential_name is :1 

也无法在oracle中工作。

如果我有两个相同类型的凭据,但是一条记录的CREDENTIAL_NAME值为(null),另一条记录为DaisyDuck'我会得到两条记录。

1 个答案:

答案 0 :(得分:0)

您可能只想检查列值和提供的值是否为空,或者列和提供的值是否匹配:

SELECT COUNT(*) AS count
FROM iam.credential
WHERE (iam.credential.CREDENTIAL_TYPE = :1
OR (iam.credential.CREDENTIAL_TYPE is null AND :1 is null))
AND (iam.credential.CREDENTIAL_NAME = :2
OR (iam.credential.CREDENTIAL_NAME is null AND :2 is null))
AND ...

如果您的表列不可为空,并且在达到此点之前检查匹配的用户提供的值不为null,则可能不必为每个值执行此操作。

你的方法有潜在的缺陷。在多用户系统中,两个会话可以输入相同的值,检查并获得零计数,然后插入 - 导致重复行,除非您对所有值都有唯一约束。如果你确实有这样的约束,那么计数将防止在某些时候插入违规,但并非总是如此,因此可能不值得额外的数据库之旅。