Можно ли в T-SQL выбрать строки с заданными ID и в заданном порядке? - CodeHelper

Можно ли в T-SQL выбрать строки с заданными ID и в заданном порядке?

2

Имеется список идентификаторов строк (ID). Нужно выбрать из таблицы строки, для которых ID находится в этом списке так, чтобы строки в выборке шли в том же порядке, что и элементы ID в списке. Например, допустим, что список ID — это (1, 3, 2). Если выполнить такой запрос:

SELECT id FROM some_table WHERE id in (1, 3, 2)

то получим строки в порядке [1, 2, 3] а не [1, 3, 2] как в исходном списке.

Лучший ответ:

2

Известно, что без ORDER BY требуемый порядок в выходном рекордсете вообще-то говоря не гарантирован. А в данном случае нужно именно гарантировать порядок строк, когда просто нет поля, по которому можно сделать ORDER BY. Есть следующее решение — ввести собственное фиктивное поле и делать ORDER BY по нему. Нам понадобится функция, которая парсит строку с перечислением идентификаторов (ID) и возвращает идентификаторы в виде набора данных:

IF OBJECT_ID (N'ParseIDList') IS NOT NULL
    DROP FUNCTION [ParseIDList]
GO

CREATE FUNCTION [ParseIDList](@idList VARCHAR(MAX))
RETURNS @retList TABLE(N INT identity(1,1), ID INT)
AS
BEGIN
    DECLARE @i INT, @j INT, @N INT, @val INT

    SET @i = 0
    SET @j = 1
    SET @N = LEN(@idList)
    WHILE @i < @N + 1 BEGIN

    	SET @i = CHARINDEX(',',@idList,@j)

    	IF @i = 0 SET @i = @N + 1

    	SET @val = SUBSTRING(@idList,@j,@i - @j)

    	INSERT INTO @retList ([ID]) VALUES (CONVERT(INT,@val))

    	SET @j = @i + 1
    END
    RETURN
END
GO

Затем, при запросе мы можем сделать JOIN на результат, возвращаемый этой функцией:

SELECT 
  id 
FROM some_table
  join dbo.ParseIDList('1,3,2') p on p.ID = some_table.id
order by p.N
v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.