创建字母索引列表(ColdFusion+Microsoft SQL Server)

创建字母索引列表(ColdFusion+Microsoft SQL Server),coldfusion,Coldfusion,我目前正在努力寻找谁知道如何做到这一点?我尝试了几种不同的方法,结果都是半途而废,但不是我想要的。基本上,我试图创建一个显示所有波段a-Z的列表,但波段名称是从数据库中调用的,因此我必须在嵌套列表中使用波段名称。如果我重新编写代码并发布,可能会有人看到我的错误 <cfoutput query="bandNameList"> <cfloop from="65" to="90" index="i"> <UL> <LI> #chr(

我目前正在努力寻找谁知道如何做到这一点?我尝试了几种不同的方法,结果都是半途而废,但不是我想要的。基本上,我试图创建一个显示所有波段a-Z的列表,但波段名称是从数据库中调用的,因此我必须在嵌套列表中使用波段名称。如果我重新编写代码并发布,可能会有人看到我的错误

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

更新查询,使其具有leftband_名称,1作为BandStart,并确保在order by中按band_名称排序。然后使用group输出列表

<cfoutput query="bandNameList" group="BandStart">
 <UL>
  <LI>#bandNameList.BandStart#
   <cfoutput>
    <UL>
     <LI> #bandNameList.band_name# </LI>
    </UL>
   </cfoutput>
  </LI>
 </UL>
</cfoutput>

我想你想要的是只输出以字母开头的第一个乐队的字母。 实现这一点的一种方法是稍微更改查询注意,我在这里使用的是我认为是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>
请尝试以下代码:

<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>

另一种方法是编写一个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属性一起使用。

如果要显示所有字母,即使不存在以该字母开头的标注栏,另一个选项是使用CTE生成字母表a-Z。然后使用分组的cfoutput显示结果:


似乎这会对查询中的每个记录重复A-Z?这将为查询的每一行输出26行,并为每个不匹配的结果输出一个空行。很抱歉误解了。我的假设是显示从A到Z的列表以及对应于它们的值…感谢指针Leigh和Matt我认为这是一个错误更有效的过程。工作非常出色,需要稍微调整一下从子字符串到Leftband_名称,1作为第一个字母,但效果很好。我现在唯一的问题是得到以数字开始的波段,以0-9而不是随机数字出现。希望上面的编辑能涵盖0-9的情况。我鼓励你也看看Leigh的解决方案,因为它巧妙地涵盖了没有以字母“q”开头的标注的情况。你想显示没有匹配标注的字母吗?@Dan-谢谢你的语法更正。我去批准编辑,但有人已经拒绝了。。。不管怎样,现在已经修好了。
<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>