2011-01-04 5 views
0

Getestet habe ich diese mit CF 9 und MsSQL 2005Coldfusion MsSQL SUM having() mit NULL-Wert

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) 

dann Abfrage in 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 

das Ergebnis ist

alt text

dann habe ich versucht cfquery mit

<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#"> 

und das Ergebnis ist

alt text alt text

bearbeiten (hier starten): nach unten scrollen, um Debugger muss ich diese

alt text

dass rot Bereich angezeigt, dass qr yHavingSum_4 ausgeführt wird, mit 0 Rekord, aber in der Ausnahme Abschnitt qryHavingSum_4 ist nicht definiert (das <cfdump var="#qryHavingSum_4#">) bearbeiten (Ende hier)

wenn ich qryHavingSum_4 zu

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

das Ergebnis zu ändern ist

alt text

und dann I Tri ed zu ändern SUM(B_INT) (ohne ISNULL) und HAVING SUM(B_INT) (ohne ISNULL) mit anderen Operator > >= < <= <> != und es funktioniert.

Warum kann ich nicht die = mit Abfrage oben in CF verwenden? ist es CFbugs?

danke

Antwort

4

Management Studio die nulls abstreift (wenn Sie es auf die Registerkarte Nachrichten laufen überprüfen und Sie werden folgendes sehen)

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

Coldfusion MSSQL-Treiber nicht.

Die Verwendung der Isnull-Funktion ist der beste Ansatz.

Alternativ können Sie Ansi Warnungen in Ihrem cfquery deaktivieren und wieder aktivieren, nachdem sie laufen So können Sie Abfrage 4 bis

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

ändern, warum die qryHavingSum_4 ausgeführt wird, aber wir können es nicht verwenden? – tsurahman

+1

Wenn Sie 'isNull()' aus irgendeinem Grund nicht mögen (vielleicht sind Sie mit mySQL vertrauter, wobei 'isNull()' einen ganz anderen Zweck hat), können Sie stattdessen 'coalesce()' verwenden. Für zwei Parameter funktioniert es genauso wie 'isNull()'. –