WHERE 子句中的 IF 语句与 Oracle SQL on count

IF statement in WHERE clause with Oracle SQL on count

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

    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)

因为当我只想要与用户输入匹配的那个时,这将 return 计数为 2。

基本上,如果记录存在或不存在,我希望计数为 return 1 或 0。

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

如果用户因为不需要而未提供值,则该值将为空。我需要查询更改为

    credential_name is null 

因为

    credential_name = null

在 Oracle 中不起作用。

如果它不为空,那么我需要它是

   credential_name = :1 

它将填充用户提供的值。

   credential_name is :1 

在 oracle 中也不起作用。

如果我有两个相同类型的凭据,但一个记录的值为 CREDENTIAL_NAME,另一个记录的值为 'DaisyDuck'.

,我将取回两条记录

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

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 ...

如果您有 table 列不可为空,并且您要检查匹配的用户提供的值是否不为空,则您可能不必为每个值都执行此操作,然后再到达这一点。

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