2011-12-12 32 views
5

嗨,大家好我已在SQL下面的查询SQL获取信息,但在错误的顺序

SELECT 
a1 
FROM 
dbo.myProductNames 
WHERE 
keycode = 40 OR keycode = 28 OR keycode = 32 OR keycode = 50 

A1 =名称 我需要在表格中的信息输出其查询的顺序IVE问道名字,所以我需要40先是然后28等等。

原因是这是我的代码读取结果并存储在一个数组中,然后用于显示在窗体上。

的SQL查询来自该表具有存储在NUM顺序的信息,因此将于28日先读等等等等

正如我刚才所说,我需要得到我的输入顺序的信息where子句。

虽然我从来没有尝试过嵌套选择,但我正在考虑使用嵌套Select语句。

或者,有没有简单的方法?

任何帮助将是伟大的!

非常感谢提前!

!!!!!更新!!!!!

好的这里是解决方案谢谢你们!

SqlCommand pgNameFill = new SqlCommand("SELECT a1, CASE keycode WHEN @pg1 THEN 1 WHEN @pg2 THEN 2 WHEN @pg3 THEN 3 WHEN @pg4 THEN 4 END AS SortOrder FROM dbo.myProductNames WHERE keycode IN (@pg1, @pg2, @pg3, @pg4) ORDER BY SortOrder ASC", conny1); 

     pgNameFill.Parameters.AddWithValue("@pg1", pg1); 
     pgNameFill.Parameters.AddWithValue("@pg2", pg2); 
     pgNameFill.Parameters.AddWithValue("@pg3", pg3); 
     pgNameFill.Parameters.AddWithValue("@pg4", pg4); 
     SqlDataReader readpg = pgNameFill.ExecuteReader(); 

非常感谢所有的帖子!我希望我能举出更多的答案,而不仅仅是一个,哦,好评如潮!

+2

顺便说一句,你还可以使用WHERE密钥代码(40,28,32,50 ),你似乎在寻找某种ORDER BY? – Ruben

+0

根据您所做的一些评论,您声明这将被参数化。是否会有固定数量的整数参数?或者您是否需要一个接受“任意数量”参数的解决方案,并且仍然维护订单?那么,它会是动态SQL(建立一个SQL字符串执行,与该字符串中引用的参数),或存储过程?此外,哪个版本的SQL是这样的? – MatBailie

+0

啊是的,它将始终是4个参数,即时通讯服务器上使用MSSQL。我将在c#中使用附加到我的代码的字符串中的选择。 – lemunk

回答

5

添加以下ORDER BY子句:

ORDER BY 
CASE keycode 
    when 40 then 1 
    when 28 then 2 
    when 32 then 3 
    when 50 then 4 
END 
+0

更新了我的文章 – lemunk

+0

传奇!工作得很好! – lemunk

4

您需要使用ORDER BY关键字。除非在查询中指定了订单,否则无法保证数据库将以何种顺序返回记录。表中记录的顺序不一定是查询结果中记录的顺序。

如果您需要的订单不是严格的数字或字母顺序,您可能会发现需要在表中添加一个额外的SortOrder列,然后您可以根据需要使用该列进行排序。

+2

但按顺序排序?他想按键码进行排序,但不是ASC或DESC,而是以特定方式对每个查询(如果我理解正确)。 – Flo

+0

我同意,通常这是我第一次尝试解决这个小问题。但订单是用户希望的,所以可能没有订单,这是我最大的问题,我有 – lemunk

+0

完全正确的flo,因为我说这是用户设置的恼人的问题,呵呵,如果我有我的方式,我会对信息ASC或DESC进行排序并且不会有probs! – lemunk

5

单向(假设您的历史记录为mssql);

;with myRank(rank, keycode) as (
    select 1, 40 union 
    select 2, 28 union 
    select 3, 32 union 
    select 4, 50 
) 
select 
    a1 
from 
    myProductNames 
    inner join myRank on (myProductNames.keycode = myRank.keycode) 
order by 
    myRank.rank asc 
+0

看起来很有趣,还有一件事情,虽然看着你做了什么,我的价值观将被传递参数,所以它会是keycode = @ pg1。这可以传递这样的参数吗?还是必须以不同的方式完成? – lemunk

+0

它取决于变量究竟是什么,你可以在'select 1,@ 1stparam_with_top_rank union ...'中使用cte中的变量......' –

+0

就个人而言,我会避免将这种逻辑硬编码到查询中。它需要改变时会发生什么?可能是一个维护头痛。 – Simon

2

添加到Simon的答案。我想查询更改为类似:

SELECT 
a1, 
CASE keycode WHEN 40 THEN 1 
WHEN 28 THEN 2 
WHEN 32 THEN 3 
WHEN 50 THEN 4 END AS SortOrder 
FROM dbo.myProductNames 
WHERE keycode IN (40, 28, 32, 50) 
ORDER BY SortOrder ASC 
+0

替代固定的键码,但我的反弹问题是关于参数的问题。在我的代码中,用户选择了一个“pg”(产品组),它可能是40等。然后,这将作为参数传递到我的c#代码中的sql阅读器中,如下所示:“WHERE keycode = @ pg1 OR keycode = @ pg2 .. ..等等“。我只问我的理由是因为如果我记得使用参数时总会有一些限制。 – lemunk

+0

或者我在想什么? – lemunk

+0

更新了我的文章 – lemunk

1
SELECT a1 
FROM myProductNames 
ORDER BY CASE WHEN keycode =40 THEN 1 
       WHEN keycode =28 THEN 2 
       WHEN keycode =32 THEN 3 
       WHEN keycode =50 THEN 4 
       ELSE 5 
       END; 
+0

更新了我的帖子 – lemunk