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