Добавьте номер строки на основе предоставленной последовательности значений


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 3

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

SQL Fiddle Demo

Обновленная демо - с суб-игр.

Также Вы можете использовать значения в качестве источника таблицы

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  

SQL Fiddle Demo

У меня может возникнуть соблазн сделать это с помощью строковых функций:

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+',%'