2011-01-04 2 views
0

Я проверил это с CF 9 и MSSQL 2005ColdFusion MsSQL HAVING SUM() со значением NULL

CREATE TABLE HAVING_SUM 
(
    A_VARCHAR VARCHAR(5), 
    B_INT INT 
) 

INSERT INTO HAVING_SUM (A_VARCHAR, B_INT) VALUES ('AB', 2) 
INSERT INTO HAVING_SUM (A_VARCHAR, B_INT) VALUES ('AB', 3) 
INSERT INTO HAVING_SUM (A_VARCHAR, B_INT) VALUES ('AB', 5) 
INSERT INTO HAVING_SUM (A_VARCHAR, B_INT) VALUES ('CD', 2) 
INSERT INTO HAVING_SUM (A_VARCHAR, B_INT) VALUES ('CD', 7) 
INSERT INTO HAVING_SUM (A_VARCHAR, B_INT) VALUES ('CD', 8) 
INSERT INTO HAVING_SUM (A_VARCHAR, B_INT) VALUES ('CD', NULL) 

и затем запрос в Ms среде SQL Server Management Studio Express

SELECT * 
FROM HAVING_SUM 

SELECT A_VARCHAR, 
     SUM(B_INT) AS B_INT 
FROM HAVING_SUM 
GROUP BY A_VARCHAR 

SELECT A_VARCHAR, 
     SUM(B_INT) AS B_INT 
FROM HAVING_SUM 
GROUP BY A_VARCHAR 
HAVING SUM(B_INT) = 10 

SELECT A_VARCHAR, 
     SUM(B_INT) AS B_INT 
FROM HAVING_SUM 
GROUP BY A_VARCHAR 
HAVING SUM(B_INT) = 10.5 

результат

alt text

я попытался с помощью cfquery

<cfquery name="qryHavingSum_1"> 
SELECT * 
FROM HAVING_SUM 
</cfquery> 

<cfdump var="#qryHavingSum_1#"> 

<cfquery name="qryHavingSum_2"> 
SELECT A_VARCHAR, 
     SUM(B_INT) AS B_INT 
FROM HAVING_SUM 
GROUP BY A_VARCHAR 
</cfquery> 

<cfdump var="#qryHavingSum_2#"> 

<cfquery name="qryHavingSum_3"> 
SELECT A_VARCHAR, 
     SUM(B_INT) AS B_INT 
FROM HAVING_SUM 
GROUP BY A_VARCHAR 
HAVING SUM(B_INT) = 10 
</cfquery> 

<cfdump var="#qryHavingSum_3#"> 

<cfquery name="qryHavingSum_4"> 
SELECT A_VARCHAR, 
     SUM(B_INT) AS B_INT 
FROM HAVING_SUM 
GROUP BY A_VARCHAR 
HAVING SUM(B_INT) = 10.5 
</cfquery> 

<cfdump var="#qryHavingSum_4#"> 

и результат

alt text alt text

Редактировать (начало здесь): прокрутки вниз, чтобы отладчик я получил это

alt text

, что красный область указала, что qr yHavingSum_4 выполняется с 0 записи, но в Exception раздел qryHavingSum_4 не определен (<cfdump var="#qryHavingSum_4#">) Edit (конец здесь)

, если я изменю qryHavingSum_4 к

<cfquery name="qryHavingSum_4"> 
SELECT A_VARCHAR, 
     SUM(ISNULL(B_INT, 0)) AS B_INT 
FROM HAVING_SUM 
GROUP BY A_VARCHAR 
HAVING SUM(ISNULL(B_INT, 0)) = 10.5 
</cfquery> 

результат является

alt text

, а затем я третье состояние ed для изменения SUM(B_INT) (без ISNULL) и HAVING SUM(B_INT) (без ISNULL) с другим оператором > >= < <= <> != и он работает.

Почему я не могу использовать = с запросом выше в CF? это CFbugs?

спасибо

ответ

4

студия управления обрезает в аннулирует (при запуске он проверяет вкладку сообщений, и вы увидите следующее)

Warning: Null value is eliminated by an aggregate or other SET operation. 

Водитель ColdFusion MSSQL нет.

Использование функции isnull - лучший подход.

В качестве альтернативы вы можете отключить AnSi предупреждения в вашем cfquery и повторно включить их после того, как они работают Таким образом, вы можете изменить запрос 4 к

SET ANSI_WARNINGS OFF 
SELECT A_VARCHAR, 
     SUM(B_INT) AS B_INT 
FROM HAVING_SUM 
GROUP BY A_VARCHAR 
HAVING SUM(B_INT)=10.5 
SET ANSI_WARNINGS ON 
+0

почему qryHavingSum_4 выполняется, но мы не можем использовать его? – tsurahman

+1

Если вам почему-то не нравится «isNull()» (возможно, вы более знакомы с mySQL, в котором «isNull()» имеет совершенно другую цель), вы всегда можете использовать «coalesce()». Для двух параметров он работает так же, как «isNull()». –

Смежные вопросы