2016-06-12 12 views
4

これは異なる種類のNULLがありますか?

<cfquery name="data"> 
    SELECT 
     NULL     AS plainNull, 
     CAST(NULL AS datetime) AS Due_Date 

</cfquery> 

から来たはヌルのこれら2種類ありますか?違い

注どのようなものです: How can I call a function in another CFC file from within a query of a function in one cfc file?

+1

cfquery dbtype = "query"またはデータベースをクエリしていますか? UNIONでこのステートメントを使用して両側の型が同一であることを確認する場合は、CAST(datetimeとしてのNULL)を使用すると便利です。 –

+0

私はデータベース呼び出しを行っています –

答えて

6

から適応はい、違いがある - ではなく、あなたが考えることが可能な方法は。

NULL自体のデータ型を有し、一方はSQLの評価の一部として(暗黙的または明示的に)それにに関連されることはありません。上記のSELECTステートメントでは、データ型が列メタデータに適用されます。明示的なCASTがなければ、data type defaults to INT

このクエリを取る:あなたは、クエリのメタデータを調べると

<cfquery name="qTest" datasource="#variables.sqlServerDSN#"> 
    SELECT NULL AS NonSpecifiedNull 
     , CAST(NULL AS datetime) AS DateTimeNull 
     , CAST(NULL AS varchar(25)) AS VarcharNull 
</cfquery> 

<cfdump var="#getMetaData(qTest)#" label="Query MetaData"> 

、クエリは、3つの異なるデータ型の列が含まれています。integerdatetimevarchar

Dump of Query Metadata

のColdFusionからデータ型は、さまざまな関数、比較、QoQ、およびクエリオブジェクトitseの変更時に列の値がどのように解釈されるかに影響しますlf。たとえば、3つの列のそれぞれを日付時間オブジェクトで更新します。

<cfset dateTimeNow = now()> 
<cfset qTest.NonSpecifiedNull[1] = dateTimeNow> 
<cfset qTest.DateTimeNull[1] = dateTimeNow> 
<cfset qTest.VarcharNull[1] = dateTimeNow> 

<cfdump var="#qTest#" label="Query Values"> 

結果は非常に異なります。 "DateTimeNull"に挿入された値は、日付オブジェクトのままです。ただし、 "VarcharNull"に挿入すると同じ値が文字列に変換され、 "NonSpecifiedNull"に挿入されると整数に変換されます。後者の2つは、ほぼ確実にではなく、の日付オブジェクトの処理方法を示します。そのため、元のSQLクエリに適切なCASTを含める方が良いです。 ColdFusionは非常に寛容であり、比較的型なしで確かに

Dump of Query Data

。したがって、日付オブジェクトを文字列または整数として格納することは、常にハードエラーを引き起こすとは限りません。しかし、最悪の場合にエラーが発生しやすく、間違った結果を生み出す可能性がある暗黙の変換を強制します。 CASTに最高の

dateCompare(dateTimeNow, qTest.NonSpecifiedNull[1]) eq 0 ? "EQUAL" : "DIFFERENT" 

だから、再び:あなたは「NonSpecifiedNull」欄に元の日付を比較した場合たとえば、あなたはおそらく、彼らが等しくなるように期待する、しかし...彼らが原因データ型に、ではありません予想される結果を確実にするために、正面の正しいタイプに調整してください。

関連する問題