【问题标题】:sql getting information, but in wrong ordersql获取信息,但顺序错误
【发布时间】:2012-01-18 10:43:19
【问题描述】:

我在 sql 中有如下查询:

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

a1 = 名称

我需要表格中的信息以按我要求的顺序输出其查询的名称,所以我需要先是 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();

非常感谢所有的帖子!我希望我可以标记更多的答案,而不仅仅是一个,哦,大家都赞成!

【问题讨论】:

  • 顺便说一句,您也可以使用 WHERE keycode IN(40,28,32,50) 并且您似乎正在寻找某种 ORDER BY ?
  • 根据您制作的几个 cmets,您声明这将是参数化的。是不是你有固定数量的整数参数?或者您是否需要一个接受“任意数量”参数并仍保持顺序的解决方案?那么,它会是动态 sql(构建一个要执行的 sql 字符串,并在该字符串中引用参数),还是一个存储过程?另外,这适用于哪个版本的 SQL?
  • 啊,是的,它总是 4 个参数,我在 2008 服务器上使用 MSSQL。我将在 c# 中附加到我的代码的字符串中使用选择
  • @Steven Smith:在您的 SqlCommand 中,WHEN pg4 THEN 4 应该是 WHEN @pg4 THEN 4
  • 另见此相关(但更新)question

标签: sql


【解决方案1】:

添加以下 ORDER BY 子句:

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

【讨论】:

    【解决方案2】:

    一种方式(假设您的历史记录中的 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
    

    【讨论】:

    • 这看起来很有趣,虽然看看你所做的还有另一件事,我的值将是传递的参数,所以它将是 keycode = @pg1。可以传递这样的参数还是必须以不同的方式完成?
    • 这取决于究竟是什么变量,您可以在cte中使用变量,如select 1, @1stparam_with_top_rank union ...
    • 就我个人而言,我会避免将这种逻辑硬编码到查询中。当它需要改变时会发生什么?可能是一个令人头疼的维护问题。
    • 假设总是有 4 个参数并且您希望它们按 1 到 4 的顺序排序,您可以将固定键码替换为 select 1, @pg1 union select 2, @pg2 ...
    【解决方案3】:

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

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

    【讨论】:

    • 但是按什么排序?他想通过键码订购,但不是 ASC 或 DESC,而是以特定方式为每个查询(如果我理解正确的话)。
    • 我同意,通常这是我第一次尝试解决这个小问题。但是订单是用户想要的,所以可能没有订单,这是我遇到的最大问题
    • 完全正确flo,正如我所说,这是用户设置的烦人问题呵呵,如果我有我的方式,我只会对信息进行ASC或DESC排序,不会有问题!
    • 如果不对查询中的大量逻辑进行硬编码,我认为没有任何简单的方法可以绕过它。如果用户希望能够以任意方式排序,那么您可能需要将其存储在数据库中的附加列中。
    • 是的,一些建议建议为每个值分配一个 ID。
    【解决方案4】:

    补充西蒙的答案。我会将查询更改为:

    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
    

    【讨论】:

    • 很好的答案,但我要反弹的问题是参数如何。在我的代码中,用户选择一个可能是 40 等的“pg”(产品组)。然后在我的 c# 代码中作为 sql 阅读器中的参数传递,例如“WHERE keycode = @pg1 OR keycode = @pg2.. ..等等” 。我问的唯一原因是因为如果我记得在使用参数时总是有一些限制。
    【解决方案5】:
    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;
    

    【讨论】:

      猜你喜欢
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      相关资源
      最近更新 更多