SQL Server Select query with IN() 并按相同顺序排序



我需要一个带有IN子句的SELECT查询,以及Order by

select * 
from table 
where column_id IN (5,64,2,8,7,1) 

此代码返回1, 2, 5, 7, 8, 64

现在我需要按顺序返回相同的选择

输出需要:5, 64, 2, 8, 7, 1

在Mysql中,字段选项是存在的,但SQL Server没有这样的字段选项。

使用要在Table Valued Constructor中搜索的值,并给出行号,然后将其与表联接,然后根据表值构造函数中的值对其进行排序。

查询

SELECT t1.* 
FROM(VALUES(1, 5), (2, 64), (3, 2), (4, 8), (5, 7), (6, 1)) t2([rn], [id])
JOIN [your_table_name] t1
ON t1.[id] = t2.[id]
ORDER BY t2.[rn];

您还可以创建一个表变量,其中包含要搜索的值以及其中的标识列。然后将其与您的桌子连接起来。

查询

DECLARE @tbl AS TABLE([rn] INT IDENTITY(1, 1), [id] INT);
INSERT INTO @tbl([id]) VALUES(5), (64), (2), (8), (7), (1);
SELECT t1.*
FROM [your_table_name] t1
JOIN @tbl t2
ON t1.[id] = t2.[id]
ORDER BY t2.[rn];

在SQL服务器中,当你想按某物排序时,你必须特别说明它。

试试这个

select * from table where column_id IN (5,64,2,8,7,1)
order by
case column_id
    when 5 then 1
    when 64 then 2
    when 2 then 3
    when 8 then 4
    when 7 then 5
    when 1 then 6
    else 10
end;

这有点复杂,但你可以这样做:

WITH inner_tbl (key, orderId) AS
( 
SELECT key, ROW_NUMBER() OVER(ORDER BY SELECT 1)
FROM (VALUES (5),(64),(2),(8),(7),(1) ) d
)
SELECT table.* FROM table 
INNER JOIN inner_tbl ON table.column_id=inner_tbl.key
ORDER BY inner_tbl.orderId

ROW_NUMBER函数将创建您需要的订单列。

首先,在 sqlserver 中创建一个字符串拆分函数:

CREATE FUNCTION [fn_split](@text NVARCHAR(2000), @delimiter NCHAR(1))
    RETURNS @retable TABLE([s_key] NVARCHAR(64))
AS
BEGIN
    DECLARE @index INT;
    SET @index = -1;
    WHILE (LEN(@text) > 0)
    BEGIN
        SET @index = CHARINDEX(@delimiter, @text);
        IF (@index > 1)
            BEGIN
                INSERT INTO @retable VALUES(LEFT(@text, @index - 1));
                SET @text = RIGHT(@text, (LEN(@text) - @index));
            END
        ELSE
            BEGIN
                INSERT INTO @retable VALUES(@text);
                BREAK;
            END
    END
    RETURN;
END

其次,像这样使用 sql 查询:

DECLARE @ids NVARCHAR(200)='5,64,2,8,7,1';
SELECT * FROM [table] a INNER JOIN (SELECT [s_key] FROM [fn_split](@ids, ',')) b ON [b].[s_key] = a.[column_id];

最新更新