我正在尝试为网站开发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'我会得到两条记录。
答案 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,则可能不必为每个值执行此操作。
你的方法有潜在的缺陷。在多用户系统中,两个会话可以输入相同的值,检查并获得零计数,然后插入 - 导致重复行,除非您对所有值都有唯一约束。如果你确实有这样的约束,那么计数将防止在某些时候插入违规,但并非总是如此,因此可能不值得额外的数据库之旅。