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

我认为您所追求的是仅输出以该字母开头的第一个波段的字母。实现此目的的一种方法是稍微更改您的查询(注意我在这里使用我认为是 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

更新您的查询以具有 aleft(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 回答
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 回答
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 与 group 属性一起使用。

于 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 回答