2012-05-24 50 views
0

我在数据库中有5个可能的值有一个字段(例如,“低”到“高”):一般,好,非常好,理想,siganture理想SQL字值范围之间在哪里

我有一个coldfusion窗体,每个窗体有两个下拉菜单,每个下拉菜单都有所有的值。我期望做的是能够让用户选择一个范围。例如dropdown1 =公平下拉2 =很好。因此,这会在一定程度生成SQL WHERE语句:

年级(“公平”,“好”,“很好”)

你可以认为这是因为该值必须编程一个聪明的办法就这样。我想也许如果我把它们放在一个数组中,然后通过它或什么的。我有点难住这个任何帮助,将不胜感激。

+5

您的数据库设计是错误的。 :-)它应该是数字值(例如,“fair”= 0,“signature ideal”= 4),然后根据所选项目的索引,您的查询就是一个简单的BETWEEN语句。此外,您应该让用户只选择较低的值,然后在第二个组合框(下拉列表)中仅显示较高的值以供他们选择 - 这可以简化确保条件不会反转的情况(例如,低=“理想“,高=”公平“)。 –

+0

而且,几乎在任何情况下,从长远来看,解决和修复糟糕的设计都比编码糟糕的设计更好,从而使您走上错误的道路。 –

+0

@Ken - 你读了我的想法:) – Leigh

回答

3

正如其他人所说,重新设计最终是更好的行动方式,无论是在效率和数据完整性方面。但是,如果您绝对不能改变结构,一个可能的解决方法是创建允许的等级描述的查找表,与每一个数字的评价值一起:

GradeID | GradeText  | Rating 
1  | Fair    | 0 
2  | Good    | 1 
3  | Very Good  | 2 
4  | Ideal   | 3 
5  | Signature Ideal | 4 

然后填充从你的选择列表查询表上的一个查询。请务必ORDER BY Rating ASC并使用评级号码作为列表值。然后在您的操作页面上,使用所选值按范围进行过滤。 (显然验证选定的范围也是有效的)

SELECT t.ColumnName1, t.ColumnName2 
    FROM SomeTable t INNER JOIN YourLookupTable lt ON lt.Grade = t.GradeText 
    WHERE lt.Rating BETWEEN <cfqueryparam value="#form.dropdown1#" cfsqltype="cf_sql_integer"> 
      AND <cfqueryparam value="#form.dropdown2#" cfsqltype="cf_sql_integer"> 

再次,我会建议重组。但是,如果这真的不是一种选择,上述应该起作用。

+0

哇,这看起来不错,我不会有机会尝试一下,但会让你知道它是否可行。非常感谢。 –

+0

今晚试了一下 - 像梦一样的作品。谢谢你的帮助。 –

+0

很高兴我能帮到你。 – Leigh