TSQL: добавить строки в набор результатов "SELECT"

Мы используем SQL Server 2017 Express, и у меня есть этот оператор SELECT:

SELECT * FROM 
(SELECT '' as ItemId, '-- Please select --' as ItemDesc
    UNION 
    SELECT [id] as ItemId, [DisplayName] as ItemDesc 
    FROM [table] 
) as t
ORDER BY
CASE ItemDesc
    when '-- Please select --' then 1
    when 'bla' then 2
    when 'fasel' then 3
    when 'blubb' then 4
    when 'lala' then 5
    when 'duh!' then 6
    when 'spamalot' then 7
    else 8
end, ItemDesc

Это работает, но мне нужно добавить вторую "статическую" строку в поз. 8, что-то вроде

SELECT * FROM 
    (SELECT '' as ItemId, '-- Please select --' as ItemDesc,
     '' as ItemId, '----------' as ItemDesc
        UNION 
    ...
CASE ItemDesc
    ...
        when '----------' then 8
        else 9

Конечно, это не работает, но вы поняли. К сожалению, у меня нет доступа к коду, который создает список, все, что я мог сделать, это добавить Javascript в вывод.

Это как-то возможно? И имеет ли смысл делать это НЕ используя JS и манипулировать DOM?

2 ответа

Решение

Вам нужно добавить еще один union:

SELECT t.*
FROM (SELECT '' as ItemId, '-- Please select --' as ItemDesc
      UNION 
      SELECT '', '----------' 
      UNION
      SELECT [id] , [DisplayName] 
      FROM [table] 
     ) t
ORDER BY . . . ;

Добавьте новый столбец к каждому SELECT в вашем UNION, чтобы определить порядок сортировки, чтобы вам не пришлось возиться с CASE:

SELECT itemid, ItemDesc FROM 
(
    SELECT '' as ItemId, '-- Please select --' as ItemDesc, 0 as mysortcolumn
    UNION 
    SELECT 
        [id] as ItemId, 
        [DisplayName] as ItemDesc, 
        CASE ItemDesc           
            when 'bla' then 1
            when 'fasel' then 2
            when 'blubb' then 3
            when 'lala' then 4
            when 'duh!' then 5
            when 'spamalot' then 6
            else 7 END as mysortcolumn 
    FROM [table] 
    UNION 
    SELECT '' as ItemId, '-- Please select --' as ItemDesc, 1000 as mysortcolumn
) as t
ORDER BY mysortcolumn asc;

НО... кажется, что вы пытаетесь создать пользовательский интерфейс в своем наборе записей. Вы уверены, что это место, где вы должны делать эту логику? Это очень громоздко для базы данных. Такое ощущение, что ты должен бежать, что ОДИН SELECT заявление против [table] с вашим заказом, а затем две начальные и конечные строки должны быть написаны вашим кодом, который создает пользовательский интерфейс (где бы эти данные не использовались).

Другие вопросы по тегам