3

私は現在、これを行う方法を知っている人を見つけるのに苦労していますか?私はいくつかの異なる方法を試しましたが、結果は中途半端でしたが、私が望んでいたものではありませんでした。基本的に、すべてのバンドAZを表示するリストを作成しようとしていますが、バンド名はデータベースから呼び出されているため、ネストされたリスト内で#band_name#を使用する必要があります。コードを書き直して投稿すると、どこが間違っているのか誰かがわかるかもしれません。

<cfoutput query="bandNameList">
  <cfloop from="65" to="90" index="i">
    <UL>
     <LI> #chr(i)#
       <UL>
         <LI> #band_name# </LI>
       </UL>
     </LI>
    </UL>
  </cfloop>
</cfoutput>
4

5 に答える 5

7

あなたが求めているのは、その文字で始まる最初のバンドの文字のみを出力することです。これを実現する 1 つの方法は、クエリを少し変更することです (ここでは SQL-92 構文と思われるものを使用していますが、特定のデータベースの最初の文字を取得するためのより良い方法があることに注意してください)。

select 
  band_name, 
  SUBSTRING(band_name from 1 for 1) AS first_letter
from 
  bands 
order by 
  band_name

これにより、クエリの最初の文字が取得されます。

数字の最初の文字を含むすべてのバンドをまとめてグループ化したい場合は、SQL の CASE ステートメントを使用してそれを行うことができます (DBMS で ascii() に相当するものを見つける必要がある場合があります)。また、ロジックを逆にして「通常の」文字と照合し、他のすべてを「0-9 と句読点」のカテゴリにまとめることもできます。多くの音楽システムがそうしていると思います (iPhone の iTunes だと思いますが、他にもあるはずです)。

select 
  band_name, 
  CASE  
    WHEN ascii(left(band_name, 1)) BETWEEN 48 AND 57 THEN '0-9'
    ELSE left(band_name, 1)
  END AS first_letter   
from 
  bands 
order by 
  band_name

これで、追加の列を cfoutput の group 属性と一緒に使用して、必要な出力を得ることができます。

<UL>
<cfoutput query="bandNameList" group="first_letter">
     <LI> #first_letter#
     <UL>
       <cfoutput>             
           <LI> #band_name# </LI>             
       </cfoutput>
       </UL>
     </LI>        
</cfoutput>
</UL>
于 2012-12-05T17:07:32.300 に答える
4

その文字で始まるバンドが存在しない場合でも、すべての文字を表示する場合は、CTE を使用して文字の表を生成する別のオプションがありますA-Z。次に、「グループ化された」cfoutput で結果を表示します。

<cfquery name="getBandNameList" ...>
    ;WITH ltrs ( code ) AS (
        SELECT  ascii('A') AS code 
        UNION ALL           
        SELECT  code + 1
        FROM    ltrs
        WHERE   ascii('Z') > code
    )
    SELECT char(code) AS letter, t.band_name
    FROM   ltrs LEFT JOIN @YourTable t ON t.band_name LIKE char(code) +'%'
    ORDER BY letter ASC, t.band_name ASC
</cfquery>

<cfoutput query="bandNameList" group="Letter">
    <UL>
     <LI> #letter#
       <UL>
         <cfoutput>
            <LI> #band_name# </LI>
         </cfoutput>
       </UL>
     </LI>
    </UL>
</cfoutput>
于 2012-12-05T17:52:55.677 に答える
4

を含むようにクエリを更新し、left(band_name,1) AS BandStartで band_name で注文するようにしてくださいORDER BY。次に、 group を使用してリストを出力します。

<cfoutput query="bandNameList" group="BandStart">
 <UL>
  <LI>#bandNameList.BandStart#
   <cfoutput>
    <UL>
     <LI> #bandNameList.band_name# </LI>
    </UL>
   </cfoutput>
  </LI>
 </UL>
</cfoutput>
于 2012-12-05T17:05:00.177 に答える
1

もう 1 つの方法は、単一のクエリ オブジェクトですべてを返す SQL Server ストアド プロシージャを作成することです。コードは次のようになります。

declare @thisNum as int
declare @lastNum as int
set @thisNum = 65;
set @lastNum = 90;

declare @letters as table(letter char(1))

while (@thisNum <= @lastNum)
begin
insert into @letters values (CHAR(@thisNum))
set @thisNum = @thisNum + 1;
end

select letter, bandname
from @letters left join band on letter = left(bandname, 1)
order by letter, bandname

次に、ColdFusion で、グループ属性を指定して cfoutput を使用できます。

于 2012-12-05T17:38:45.380 に答える
0

このコードを試してください::

<cfquery datasource="orcl" name="list">
select upper(brand) brand from tbl
</cfquery>
<cfoutput query="list">
  <cfloop from="65" to="90" index="i">
    <UL>
     <LI> #chr(i)#
       <UL>
         <LI><cfif mid(brand,1,1) eq chr(i)> #brand#</cfif></LI>
       </UL>
     </LI>
    </UL>
  </cfloop>
</cfoutput>
于 2012-12-05T17:12:02.903 に答える