我有一个包含两列的数据库:数字和名称。表格如下:
我希望select * from table where num=6 or num=3
的结果是:
但我得到的是:
如何订购结果?
答案 0 :(得分:3)
注意:我假设您的实际数据不仅仅是A,B,C,...,F。否则,您不需要数据库,可以直接执行用您的语言(example in C#)。
您应该了解过滤和排序之间的区别。
数据库中的数据按特定顺序显示。当特定订单很重要时,会在查询中指定。如果没有,一些数据库可能会以几乎不确定的顺序返回行。
当您使用where
时,您只需过滤结果。您的查询告诉数据库:
“请给我表
table
中的每一栏,因为我只对包含num
6或3的行感兴趣。”
虽然您说应该返回,但您没有指定以何种顺序。
order by
完全用于:
select * from table where num=3 or num=6 order by num desc
将按照首先出现最高num
值的顺序返回行。
顺便说一下,您不仅限于asc
和desc
。例如,如果您需要订购6
,7
,2
,3
等订单,则可以使用Microsoft SQL中的case
执行此操作服务器(以及其他数据库中的类似构造)。例如:
select [name] from table
where num in (2, 3, 6, 7)
order by case when [num] = 6 then 1
when [num] = 7 then 2
when [num] = 2 then 3
else [num] end asc
虽然这会做你想要的,但它不是一个好的解决方案,因为你需要动态地从用户的输入构建你的SQL查询 - 你应该不惜一切代价避免(因为除了性能不佳,你会结束让SQL注入通过)。
相反:
创建一个包含两列的临时表:自动递增的主键列和包含数字的列。
在第二列中插入您的值(6,7,2,3)。
加入两个表(table
表和临时表)。
过滤临时表的主键。
删除临时表。
这样做的好处是您不必动态创建查询,缺点是解决方案有点困难,特别是如果多个用户可以同时选择数据,这意味着您必须选择明智的临时表的名称。
最简单的解决方案是只用您的编程语言而不是数据库进行过滤。加载所有必需的行(不要忘记where
),并在以后过滤它们。因为根据你的评论,用户正在指定订单,我很确定你只处理几行而不是几千行,这使它成为一个理想的解决方案。如果你必须处理数十万行,当你从数据库到达时需要处理这些行而不将它们全部留在内存中,那么带有临时表(和批量插入)的先前解决方案将更合适。
最终,如果整个表中的行数较少,则甚至不必过滤数据。只需将其加载到内存中并将其作为地图保存在那里。
注意:
请勿使用select *
。在您的应用程序中几乎没有您真正需要它的情况。使用select *
而不是显式指定列至少有两个缺点:
如果以后添加了一列,您获得的数据集会有所不同,您可能需要时间注意并调试相关问题。此外,如果删除或重命名列,则错误不一定容易找到,因为错误不会出现在数据库级别,而是出现明确的显式错误消息,但在应用程序中的某处。
< / LI>它会影响性能,因为数据库需要确定应选择哪些列。如果你在一个包含几十个列的表上做select *
,包括一些blob或长字符串,而你需要的只是几列,那么性能会非常糟糕。
如果您的数据库支持in
,请使用它:
select * from table where num in (3, 6) order by num desc
答案 1 :(得分:0)
我在许多数据库中看到的用于元数据之类的列表的常见构造是向表中添加一个列,其名称为“Column_order”,一个数字。
然后你的选择是
select list, list_value
from your_table
where enabled = 1
order by column_order;
这样可以很好地允许任何你想要的任意顺序,但是如果你的应用程序有多种语言可能会因语言不同而无法正常运行。