Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WHERE子句中带有Oracle SQL on count的IF语句_Sql_If Statement_Count_Oracle Sqldeveloper_Where - Fatal编程技术网

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

WHERE子句中带有Oracle SQL on count的IF语句,sql,if-statement,count,oracle-sqldeveloper,where,Sql,If Statement,Count,Oracle Sqldeveloper,Where,我正在尝试开发一个网站的PUT方法。我使用以下代码来确保用户输入的信息与更改数据库之前的信息不同(同时防止在用户点击提交次数过多时出现大量日志文件): 我正在从我的网页中获取这些值,但是当值为NULL时,我遇到了问题。我希望能够做到以下几点: SELECT COUNT(*) AS count FROM iam.credential WHERE IF iam.credential.CREDENTIAL_TYPE is not null THEN i

我正在尝试开发一个网站的PUT方法。我使用以下代码来确保用户输入的信息与更改数据库之前的信息不同(同时防止在用户点击提交次数过多时出现大量日志文件):

我正在从我的网页中获取这些值,但是当值为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中不起作用

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

   credential_name = :1 
它将填充用户提供的值

   credential_name is :1 
在oracle中也不起作用


如果我有两个相同类型的凭据,但其中一条记录的凭据名称值为(null),另一条记录的凭据名称值为“DaisyDuck”,则我将返回两条记录。

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

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,并且在到达此点之前检查匹配的用户提供的值是否为null,则可能不必对每个值都执行此操作


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

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

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,并且在到达此点之前检查匹配的用户提供的值是否为null,则可能不必对每个值都执行此操作


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

如果表值为null且用户提供的值不为null,则会发生什么情况,反之亦然?这些是否应该被计算在内?第二个查询是如何/为什么计数为2的?您确定它是对同一行计数两次,而不是对两个相似的行进行部分匹配吗?如果表值为null且用户提供的值不为null,则会发生什么情况,反之亦然?这些是否应该被计算在内?第二个查询是如何/为什么计数为2的?您确定它是对同一行计数两次,而不是对两个相似的行进行部分匹配吗?首先,在添加之前,我使用unique键检查记录是否存在。如果它不存在,那么我插入。此计数是为了查看是否有任何不同之处需要更新数据库。如果它确实存在并且它是不同的,那么我更新首先,在添加之前,我使用唯一键检查记录是否存在。如果它不存在,那么我插入。此计数是为了查看是否有任何不同之处需要更新数据库。如果它确实存在并且它是不同的,那么我将更新它