2016-11-22 2 views
1

У меня есть образец таблицы и запроса с проблемой, описанной здесь,SQL ORDER BY входного параметра CSV

CREATE TABLE test 
(
    ID INT IDENTITY(1, 1), 
    NAME VARCHAR(250), 
    VALUE float 
) 

INSERT INTO test(NAME,[VALUE])VALUES('A',100) 
INSERT INTO test(NAME,[VALUE])VALUES('B',200) 
INSERT INTO test(NAME,[VALUE])VALUES('C',200) 

SELECT * FROM test WHERE ID IN (2,1,3) 

ID   NAME  VALUE 
----------- --------- ---------------- 
1   A   100 
2   B   200 
3   C   200 

QUERY: когда я передать в ИНЕКЕ он должен дать результат в (2,1,3) тот же порядок, как показано ниже:

ID   NAME  VALUE 
----------- --------- ---------------- 
2   B   200 
1   A   100 
3   C   200 
+1

Пожалуйста, отметьте свой вопрос в базе данных, которую вы используете. –

+0

Это не так. Он проверяет каждую строку, принадлежащую множеству, определенному в предложении 'IN', но будет выдавать набор результатов, поскольку он получает строки – Alfabravo

+0

. Ваш вопрос зависит от базы данных, поэтому, пожалуйста, сообщите нам, какой db вы используете. – scaisEdge

ответ

1

Если вы захватите копию DelimitedSplit8K вы можете сделать это:

-- assuming these values come in as a parameter: 
DECLARE @searchString varchar(100) = '2,1,3'; 

-- solution using delimitedSplit8K 
SELECT t.ID, t.Name, t.VALUE 
FROM dbo.test t 
JOIN dbo.delimitedSplit8K(@searchString,',') s ON s.item = t.id 
ORDER BY s.itemNumber; 

Результаты:

ID   Name VALUE 
----------- ----- ------ 
2   B  200 
1   A  100 
3   C  200 

Что делает этот метод особенно замечательно, как, если вы посмотрите план выполнения запроса, нет оператора сортировки.

2

Я понятия не имею, почему вы ожидать результаты быть в порядке in списка. SQL работает с неупорядоченными множествами; поэтому нет внутреннего порядка - если это явно не сделано с предложением order by.

Похоже, что вы используете SQL Server. Вы можете делать то, что вы хотите с join:

SELECT t.* 
FROM test t JOIN 
    (VALUES (2, 1), (1, 2), (3, 3) 
    ) v(id, ordering) 
    ON t.id = v.id 
ORDER BY ordering;