2

Select ステートメントで State 列と Zip3 列を 2 回選択し、見たいものを正確に示しています。ネイティブ MySQL で実行すると、正しい結果が得られます。

SELECT State,Zip3, FirstName, LastName, State, Zip3 
FROM Person
WHERE State >= 'A'
ORDER BY State, Zip3
LIMIT 10;

+-------+------+-----------+-------------+-------+------+
| State | Zip3 | FirstName | LastName    | State | Zip3 |
+-------+------+-----------+-------------+-------+------+
| AB    | T7X  | Adalei    | Starreveld  | AB    | T7X  |
| AK    | 998  | Linda     | Rosenthal   | AK    | 998  |
| AL    | 361  | Benjamin  | Sung        | AL    | 361  |
| AL    | 362  | Lawrence  | Kallus      | AL    | 362  |
| AZ    | 857  | Rose      | Springfield | AZ    | 857  |
| CA    | 941  | Maura     | Cronin      | CA    | 941  |
| CA    | 941  | Dov       | Grunschlag  | CA    | 941  |
| CA    | 943  | Ruth      | Hodos       | CA    | 943  |
| CT    | 055  | Andrew    | Salvo       | CT    | 055  |
| CT    | 064  | DEBORAH   | GRASER      | CT    | 064  |
+-------+------+-----------+-------------+-------+------+

Cold Fusion で実行すると、間違った結果が得られます。

<cfquery name = "stest" datasource = "Moxart">
select State,Zip3, FirstName,LastName,State,Zip3 from Person
where State >= 'A'
order by State,Zip3
</cfquery>
<cfset j = 0>
<table>
<cfoutput query = "stest">
<tr>
<cfloop index = "col" list = "#columnlist#">
<cfset j = j + 1>
<cfset colname[j] = #stest[col][currentrow]#>
<td>   #colname[j]# </td>
</cfloop><br/>
</tr>
</cfoutput>
</table>


Adalei      Starreveld      AB      AB      T7X     T7X  
Linda       Rosenthal       AK      AK      998     998 
Benjamin    Sung            AL      AL      361     361
Lawrence    Kallas          AL      AL      362     362
Rose        Springfield     AZ      AZ      857     857
Maura       Cronin          CA      CA      941     941
Dov         Grunschlag      CA      CA      941     941
Ruth        Hodos           CA      CA      943     943
Andrew      Salvo           CT      CT      055     055
DEBORAH     GRASER          CT      CT      064     064     

ColdFusion から正しい結果を得るにはどうすればよいですか。ColdFusion 8 と Firefox を使用しています。

4

4 に答える 4

6

列に別名を付けてみてください

select 
  State,
  Zip3, 
  FirstName,
  LastName,
  State AS State_2,
  Zip3 as Zip3_2 
from 
  Person
where 
  State >= 'A'
order by 
  State,
  Zip3
于 2012-12-22T19:28:30.760 に答える
2

エイリアスを試してみましたが、うまくいきませんでした。しかし、問題は解決しました。これは、ループしている変数の列リストでした。

列の順序を維持する

元の質問では、出力の何が問題だったのか実際には説明していませんでした;)ただし、コメントで述べたように、columnList常にアルファベット順を使用します。元の注文を取得するには、

  1. を使用しgetMetaData(query)ます。を含むクエリ列のプロパティを含む構造体の配列を返しますname
  2. または、代わりに文書化され ていない方法を使用することもできますquery.getColumnList()。列名の配列を返します (のみ)。

次に、単に使用しcfloop arrayます。MX7 以前 (配列ループをサポートしていない) を使用していない限り、リストに変換する必要はありません。

    <!--- using getMetaData --->
    <cfset colProps = getMetaData(someQuery) />
    <cfoutput query="someQuery">
        <cfloop array="#colProps#" index="col">
            #someQuery[ col.Name ][ currentRow ]# |
        </cfloop>
        <br />
    </cfoutput>

    <!--- using undocumented getColumnList() --->
    <cfset colNames = someQuery.getColumnList() />
    <cfoutput query="someQuery">
        <cfloop array="#colNames#" index="col">
            #someQuery[ col ][ currentRow ]# |
        </cfloop>
        <br />
    </cfoutput>

フィールドを 2 回要求する正当な理由がある場合があります

一意のクエリ列名

正直なところ、同じ列を複数回返す正当な理由はあまり思いつきません。Dan が指摘したように、簡単に複数回出力できます。だから私はあなたのユースケースに興味があります。

結果で同じ列名を複数回返すことは、あいまいであるため問題があります。そのため、CF は、参照時にどの列が必要かわかりません。あなたの特定のケースでは、値が両方で同じであるため、問題ではありません。ただし、データ値が異なるが、同じ列名が両方に割り当てられている次の例を考えてみてください。

<cfquery name="someQuery" datasource="someDSN">
    SELECT  1 AS Zip3, 2 AS Zip3 
    UNION ALL
    SELECT  8 AS Zip3, 16 AS Zip3 
</cfquery>

を出力する#zip3#としたら、正しい結果はどうあるべきですか? 実際にクエリをダンプすると、結果は次のようになります。

  RESULTSET query 
  Row  | ZIP3 | ZIP3 
  1    | 1    | 1  
  2    | 8    | 8  

CF は "Zip3" に使用する値がわからないため、あいまいさを解決するために見つけた最初の列を選択するようです。2 番目の「Zip3」列の値は単純に破棄されます。そのため、クエリの列名が一意になるように常にエイリアスを使用する必要があります。

もちろん、それは他のバージョンでも動作することを前提としています。重複した列名が発生したときにエラーをスローするバージョンがあることを漠然と覚えています。しかし、それは私が通常行うことではないため、テストを実行して検証する必要があります。

于 2012-12-24T03:42:34.283 に答える
0

1 回選択して 2 回表示することをお勧めします。このようなもの:

<cfscript>
Headers = "State,Zip Code,First Name,Last Name,State,Zip Code";
Fields = "state,zip3,FirstName,LastName,State,Zip3";
</cfscript>

<cfquery name = "stest" datasource = "Moxart">
select State, Zip3, FirstName, LastName
from Person
where State >= 'A'
order by State,Zip3
</cfquery>

<table>
<tr>
<cfoutput>
<cfloop index = "thisHeader" List = "#Headers>
<th>#thisHeader#</th>
</cfloop>
<cfoutput>
</tr>
<cfoutput query = "stest">
<tr>
<cfloop list = "#fields#" index = "thisField">
<td>#stest[thisField][currentrow]#</td>
</cfloop>
</tr>
</cfoutput>
</table>

このコードを実際にテストしていないことに注意してください。構文エラーが 1 つまたは 2 つある可能性がありますが、ロジックは問題ありません。

于 2012-12-22T21:54:26.107 に答える
-2

なぜ2回呼んでいるのかわかりませんが、次のようにします。

SELECT state, first_name, last_name zip FROM person WHERE state >= 'a' ORDER BY state, zip

本当にzipがテーブルに2回表示され、それらが一致することを確認したい場合

SELECT state, first_name, last_name zip FROM person WHERE state >= 'a' AND zip = zip ORDER BY state, zip
于 2012-12-22T19:23:54.993 に答える