Как создать несколько строк в 1 столбце значение или SQL-оператор с запятой в T-SQL - PullRequest
0 голосов
/ 26 сентября 2011
ColumnName  IsOrdered    Seq_ID
ABC          2              2
DEF          1              1
GHI          0             NULL
JKL          1              4
MNO          1              3
PQR          0              5

У меня есть таблица (таблица1) в базе данных с сохраненными в ней значениями выше.

Примечание: -

I. Is_Ordered столбец : 2 -> Desc;1 -> Asc;0 -> По умолчанию.

II. Столбец Seq_ID : Имена столбцов 'последовательность по' последовательности

Эти значения сохраняются в приведенной выше таблице пользователем (т.е. в интерфейсе пользователя).Я хочу создать предложение 'order by' из нескольких строк в один оператор с запятой ',' seperated (один столбец).

например: выбрать * из таблицы Table1 по DEF asc, ABC desc,MNO asc, JKL asc

Здесь я хочу написать SQL-оператор, который будет генерировать только оператор order by, как показано выше i.e. (order by DEF asc, ABC desc, MNO asc, JKL asc)

Здесь вы заметите, что столбец GHI и столбцы PQR не являютсявключены, так как эти два не выбираются в порядке выбора в пользовательском интерфейсе.

Заранее благодарю вас, кто попытался понять мой вопрос и дал соответствующее решение для этого.

Ответы [ 2 ]

1 голос
/ 26 сентября 2011

Вот, пожалуйста (возможно, нужно добавить CAST)

SELECT
    'ORDER BY ' +
      SUBSTRING(
      (
      SELECT
          ',' + ColumnName + 
               CASE IsOrdered  
                 WHEN 1 THEN 'ASC'
                 WHEN 2 THEN 'DESC'
               END
      FROM
          MyTable
      WHERE
          IsOrdered > 0 -- why have "IsIncluded" column ?
      ORDER BY
          Seq_ID
      FOR XML PATH ('')
      )
      , 2, 7999)
1 голос
/ 26 сентября 2011

Надеюсь, это поможет

DECLARE @OrderBySetting VARCHAR(max) = ''
DECLARE @OrderByString VARCHAR(max) = ''

DECLARE MY_CURSOR CURSOR
FOR  SELECT  ColumnName + ' ' + 
case IsOrdered  
    WHEN 1 THEN 'ASC'
    WHEN 2 THEN 'DESC'
    END
    + ','
FROM         Table1
WHERE     (IsOrdered <> 0)
ORDER BY Seq_ID DESC

OPEN My_Cursor 

Fetch NEXT FROM MY_Cursor INTO @OrderBySetting

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @OrderByString = @OrderBySetting + @OrderByString


FETCH NEXT FROM MY_Cursor INTO @OrderBySetting
END
CLOSE MY_Cursor
DEALLOCATE MY_Cursor

SET @OrderByString = 'SELECT * FROM TABLE1 ORDER BY ' + SUBSTRING(@OrderByString, 1, LEN(@OrderByString)-1)
...