1

我有这张表BarCode,当我做这样的查询时

SELECT Barcode 
FROM BarcodeTable 
WHERE BarCode IN 
            (
                '53-3-1',
                '51-1-1',
                '51-2-1',
                '50-10-1',
                '50-8-1',
                '51-4-1',
                '50-1-1'
            )

为什么我会得到

53-3-1
50-1-1
50-8-1
50-10-1
51-1-1
51-2-1
51-4-1

代替 ????

53-3-1
51-1-1
51-2-1
50-10-1
50-8-1
51-4-1
50-1-1

为什么 SQL 会改变条码的顺序?由于 SQL 对它们进行排序的方式(本身)导致正在执行的动态查询中出现错误,该查询sp_executesql依赖于我发送输入的顺序。为什么 SQL 会自行更改输入顺序?

51-4-1

4

4 回答 4

3

IN并不意味着最终结果的任何排序:

这个 SQL:

... WHERE x IN (1, 2, 3)

应该产生与此相同的结果:

... WHERE x IN (3, 2, 1)

IN子句基本上只过滤行,对于每一行,您可以将其视为只是询问“该行是否应该是结果集的一部分?”。

要获得特定的顺序,您必须在ORDER BY语句中添加一个子句。

要获得特定订单,您可以使用内联表:

SELECT Barcode
FROM BarcodeTable
    inner join (values
        ('*53-3-1*',  1),
        ('*51-1-1*',  2),
        ('*51-2-1*',  3),
        ('*50-10-1*', 4),
        ('*50-8-1*',  5),
        ('*51-4-1*',  6),
        ('*50-1-1*',  7)) as DummyTable (value, sortorder)
    on BarCode = value
order by
    sortorder

这将按 DummyTable 的 sortorder 字段进行排序。

您不能欺骗 SQL Server 使用IN子句本身进行排序,您必须ORDER BY以某种形式添加一个。

您还可以使用CASE WHEN ...表达式根据条形码生成排序顺序值:

SELECT Barcode
FROM BarcodeTable
WHERE BarCode IN ('*53-3-1*', '*51-1-1*', '*51-2-1*', '*50-10-1*', '*50-8-1*', '*51-4-1*', '*50-1-1*')
ORDER BY
    CASE BarCode
        WHEN '*53-3-1*'  THEN 1
        WHEN '*51-1-1*'  THEN 2
        WHEN '*51-2-1*'  THEN 3
        WHEN '*50-10-1*' THEN 4
        WHEN '*50-8-1*'  THEN 5
        WHEN '*51-4-1*'  THEN 6
        WHEN '*50-1-1*'  THEN 7
    END

正如 Lieven 的评论所暗示的,在 SQL Server 2005 上有一个替代方案,使用该WITH子句:

WITH DummyTable (value, sortorder) AS (
    SELECT '*53-3-1*' AS value,  1 AS sortorder
    UNION ALL
    SELECT '*51-1-1*',  2
    UNION ALL
    SELECT '*51-2-1*',  3
    UNION ALL
    SELECT '*50-10-1*', 4
    UNION ALL
    SELECT '*50-8-1*',  5
    UNION ALL
    SELECT '*51-4-1*',  6
    UNION ALL
    SELECT '*50-1-1*',  7
)
SELECT Barcode
FROM BarcodeTable
    inner join DummyTable
    on BarCode = value
order by
    sortorder

(注意,我不是使用的专家WITH,以上只是我一起破解的东西,但似乎有效)

于 2013-05-27T10:21:33.993 回答
3

除非您指定 order by 语句,否则不应依赖输出中的特定顺序。你必须提供一个ORDER BY来得到你所期望的。

于 2013-05-27T10:20:43.580 回答
1

要按照您的预期进行查询排序,您需要添加一个ORDER BY,否则排序将不可靠。这样的事情应该可以工作,但是根据您的条形码数量,一旦返回结果,最终可能会更容易在代码中正确排序;

SELECT Barcode 
FROM BarcodeTable 
WHERE BarCode IN ('*53-3-1*','*51-1-1*','*51-2-1*','*50-10-1*',
                  '*50-8-1*','*51-4-1*','*50-1-1*')
ORDER BY CASE BarCode WHEN '*53-3-1*'  THEN 1
                      WHEN '*51-1-1*'  THEN 2
                      WHEN '*51-2-1*'  THEN 3
                      WHEN '*50-10-1*' THEN 4
                      WHEN '*50-8-1*'  THEN 5
                      WHEN '*51-4-1*'  THEN 6
                      WHEN '*50-1-1*'  THEN 7
                      END
于 2013-05-27T10:28:15.397 回答
0

试试下面的代码

SELECT Barcode ,CASE Col_Order WHEN '53-3-1'  THEN 1
                      WHEN '51-1-1'  THEN 2
                      WHEN '51-2-1'  THEN 3
                      WHEN '50-10-1' THEN 4
                      WHEN '50-8-1'  THEN 5
                      WHEN '51-4-1'  THEN 6
                      WHEN '50-1-1'  THEN 7 
                      END     
FROM BarcodeTable 
WHERE BarCode IN 
            (
                '53-3-1',
                '51-1-1',
                '51-2-1',
                '50-10-1',
                '50-8-1',
                '51-4-1',
                '50-1-1'
            )    
ORDER BY Col_Order
于 2013-05-27T12:47:24.470 回答