2016-04-21 90 views
1

我正在嘗試爲網站開發PUT方法。我正在使用以下代碼來確保用戶輸入的信息與更改數據庫之前已有的信息不同(也防止在用戶提交次數過多時會出現大量日誌文件):WHERE子句中的IF語句與Oracle SQL計數

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子句。

如果用戶沒有提供值,因爲它不是必需的,它將爲空。我需要查詢更改爲

credential_name is null 

因爲

credential_name = null 

在Oracle不起作用。

,如果它不爲空,然後我需要它是

credential_name = :1 

而且將充滿用戶提供的值。

credential_name is :1 

在oracle中也不起作用。

如果我有兩個相同類型的憑證,但一個記錄的CREDENTIAL_NAME值爲(空),另一個記錄爲'DaisyDuck',我將返回兩條記錄。

+0

如果表值爲空並且用戶提供的值不爲null會發生什麼,反之亦然?如果這些被計數或沒有?以及/爲什麼你的第二個查詢得到了兩個數 - 你確定它是兩次計算同一行,而不是在兩個相似的行上得到部分匹配嗎? –

回答

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

您可能沒有這樣做,因爲如果你的每一個值具有不可爲空的表列,並且您在檢測到匹配的用戶提供的值在您達到此點之前不爲空。

雖然你的方法有一個潛在的缺陷。在多用戶系統中,兩個會話可以輸入相同的值,既檢查並計數爲零,然後插入 - 導致重複行,除非您在所有值中都有唯一約束。如果你確實有這樣的約束,那麼計數可以防止在插入一些時間時發生違規,但並非總是如此,所以可能不值得額外旅行到數據庫。

+0

這工作感謝亞歷克斯! –

+0

首先,我在添加之前查看是否存在使用唯一密鑰的記錄。如果它不存在,我插入。 這個計數是爲了查看是否有什麼不同,值得更新數據庫。如果它確實存在並且不同,那麼我會更新 –