创建按字母顺序排列的索引列表(ColdFusion + Microsoft SQL Server)

Lee*_*eeB 3 coldfusion

我目前正在努力寻找知道如何做到这一点的人?我已经尝试了一些不同的方法,结果是中途结果,但不是我想要的.基本上我正在尝试创建一个显示所有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>
Run Code Online (Sandbox Code Playgroud)

bar*_*nyr 7

我认为你想要的只是输出以该字母开头的第一个乐队的字母.实现此目的的一种方法是稍微更改您的查询(注意我在这里使用我认为的SQL-92语法,但是可能有更好的方法来获取特定数据库中的第一个字母):

select 
  band_name, 
  SUBSTRING(band_name from 1 for 1) AS first_letter
from 
  bands 
order by 
  band_name
Run Code Online (Sandbox Code Playgroud)

这将为您提供查询中的第一个字母.

如果要将所有带有数字首字母的波段组合在一起,则可以使用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
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用该额外列以及cfoutput的group属性来帮助您获得所需的输出.

<UL>
<cfoutput query="bandNameList" group="first_letter">
     <LI> #first_letter#
     <UL>
       <cfoutput>             
           <LI> #band_name# </LI>             
       </cfoutput>
       </UL>
     </LI>        
</cfoutput>
</UL>
Run Code Online (Sandbox Code Playgroud)