Добавьте номер строки на основе предоставленной последовательности значений
SELECT Code, Value FROM dbo.Sample
Вывод:
Code Value
Alpha Pig
Beta Horse
Charlie Dog
Delta Cat
Echo Fish
Я хочу добавить столбец последовательности, указав список кодов, и отсортировать список в соответствии с порядком, указанным в предложении IN.
SELECT Code, Value FROM dbo.Sample
WHERE Code in ('Beta', 'Echo', 'Alpha')
Я мог бы объявить переменную вверху, чтобы указать коды, если это проще.
Ключ состоит в том, что я хочу добавить номер строки, основанный на порядке, в котором я их задаю.Вывод:
Row Code Value
1 Beta Horse
2 Echo Fish
3 Alpha Pig
Edit: после этого я понял, что все мои коды имеют фиксированную длину, что имеет большое значение в том, как это можно сделать. Я отметил ответ ниже как правильный, но мое решение-использовать строку значений, разделенную запятыми:
DECLARE @CodeList TABLE (Seq int, Code nchar(3))
DECLARE @CodeSequence varchar(255)
DECLARE @ThisCode char(3)
DECLARE @Codes int
SET @Codes = 0
-- string of comma-separated codes
SET @CodeSequence = 'ZZZ,ABC,FGH,YYY,BBB,CCC'
----loop through and create index and populate @CodeList
WHILE @Codes*4 < LEN(@CodeSequence)
BEGIN
SET @ThisCode = SUBSTRING(@CodeSequence,@Codes*4+1,3)
SET @Codes = @Codes + 1
INSERT @CodeList (Seq, Code) VALUES (@Codes, @ThisCode)
END
SELECT Seq, Code from @CodeList
5 ответов:
Вот только 2 способа, которые я видел, работают точно:
Первый использует
CHARINDEX
(аналогично Гордону, но я думаю, что оператор WHERE более точен, используяIN
):SELECT * FROM Sample WHERE Code IN ('Beta','Echo','Alpha') ORDER BY CHARINDEX(Code+',','Beta,Echo,Alpha,')
Объединение запятой с кодом должно гарантировать, что под-совпадения не влияют на результаты.
В качестве альтернативы можно использовать оператор
CASE
:SELECT * FROM Sample WHERE Code in ('Beta','Echo','Alpha') ORDER BY CASE WHEN Code = 'Beta' THEN 1 WHEN Code = 'Echo' THEN 2 WHEN Code = 'Alpha' THEN 3 END
Обновленная демо - с суб-игр.
Также Вы можете использовать значения в качестве источника таблицы
SELECT Row, Code, Value FROM [Sample] s JOIN ( SELECT ROW_NUMBER() OVER(ORDER BY(SELECT 1)) AS Row, Match FROM (VALUES ('Beta'), ('Echo'), ('Alpha')) x (Match) ) o ON s.Code = o.Match ORDER BY Row
Демонстрация на SQLFiddle
Вот решение для любого списка кодов длины. Создайте таблицу с саморасширяющимся полем и кодом. Вставить в заданном порядке. Присоединяйтесь к столам и заказывайте ...
Некоторые детали. Пожалуйста, прочтите это . Вы найдете там функцию, которая создает таблицу с полем автоинкремента из строки (разделенной запятыми), т. е.
mysql> call insertEngineer('dinusha,nuwan,nirosh'); Query OK, 1 row affected (0.12 sec) mysql> select * from engineer; +----+----------+ | ID | NAME | +----+----------+ | 1 | dinusha | | 2 | nuwan | | 3 | nirosh | +----+----------+
Далее соедините вашу таблицу образцов с результатом выше. GL
Только небольшое изменение к тому, что было сделано выше, чтобы включить номера строк, а также.
SELECT CASE WHEN Code = 'BetaBeta' THEN 1 WHEN Code = 'Beta' THEN 2 WHEN Code = 'Alpha' THEN 3 END CodeOrder, * FROM Sample WHERE Code in ('BetaBeta','Beta','Alpha') ORDER BY CodeOrder
У меня может возникнуть соблазн сделать это с помощью строковых функций:
declare @list varchar(8000) = 'Beta,Echo,Alpha'; with Sample as ( select 'Alpha' as Code, 'Pig' as Value union all select 'Beta', 'Horse' union all select 'Charlie', 'Dog' union all select 'Delta', 'Cat' union all select 'Echo', 'Fish' ) select * from Sample where charindex(Code, @list) > 0 order by charindex(Code, @list)
Если вы беспокоитесь о подматчах, просто выполните трюк с разделителем:
where @list like '%,'+Code+',%'