Как использовать функцию вещи с несколькими столбцами - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь объединить два столбца из двух разных таблиц с помощью функции Stuff. Я хочу, чтобы disp_name и measure_value в одном столбце разделялись запятой ...

    SELECT GDATA.DISP_NAME
          , MEAS.MEAS_VALUE
    FROM PT_MEAS AS meas
    LEFT JOIN G_DATA AS Gdata ON meas.MEAS_ID = Gdata.MEAS_ID

Ответы [ 4 ]

1 голос
/ 28 апреля 2020
SELECT GDATA.DISP_NAME + ',' + MEAS.MEAS_VALUE
FROM PT_MEAS MEAS
    LEFT JOIN G_DATA AS GDATA ON MEAS.MEAS_ID = GDATA.MEAS_ID

Зачем вам нужно использовать функцию STUFF?

0 голосов
/ 28 апреля 2020

Мне кажется, что вы не понимаете, что на самом деле делает Stuff.
Я не могу сказать, что эта путаница встречается редко, хотя документация по этой функции очень ясна и понятна. forward.

Функция stuff очень проста: она помещает одну строку в другую.
Давайте рассмотрим несколько простых примеров:

SELECT  STUFF('ABCD', 1, 0, '|') As A,
        STUFF('ABCD', 1, 1, '|') As B,
        STUFF('ABCD', 3, 0, '|') As C,
        STUFF('ABCD', 3, 1, '|') As D

Результаты:

A       B       C       D
|ABCD   |BCD    AB|CD   AB|D

Как видите, первый параметр - это строка для заполнения, второй параметр - индекс для начала заполнения, третий параметр - сложная часть. Это длина, которую нужно удалить из исходной строки. Если это 0, то символы не удаляются из исходной строки. Четвертый параметр - это строка для заполнения.

Теперь, когда вы это знаете, для вас должно быть очевидно, почему stuff просто не имеет отношения к тому, что вы пытаетесь сделать здесь.

На самом деле вы хотите использовать concat и +, например:

SELECT CONCAT(GDATA.DISP_NAME +',', MEAS.MEAS_VALUE) As [new column name]
FROM PT_MEAS AS meas
LEFT JOIN G_DATA AS Gdata ON meas.MEAS_ID = Gdata.MEAS_ID

Теперь вам может быть интересно зачем использовать concat и оператор конкатенации строк, а не один из них - поэтому позвольте мне объяснить.
Когда вы используете оператор +, а один из операндов - null, результат будет null также - так что null + 'abc' фактически станет null.
Однако, когда вы используете concat, он просто игнорирует null значения и обрабатывает их как пустую строку, поэтому concat(null, 'abc') станет abc.
Теперь, поскольку первый столбец исходит из правой таблицы, это означает, что он может быть нулевым, и в этом случае вам, вероятно, не нужна запятая, а только второй столбец. Вот почему я конкатенировать запятую с первым столбцом, используя +.
Однако вы, вероятно, захотите вернуть второе значение, поскольку оно не равно нулю, поэтому я использовал concat, чтобы связать его с результатом.

0 голосов
/ 28 апреля 2020

Вам не нужен STUFF для этого, но вот как вы делаете это с STUFF и без ...

-- Sample Data
DECLARE @t TABLE (col1 VARCHAR(10), col2 VARCHAR(10));
INSERT @t VALUES('abc','xxx'),('fff','ggg');

-- Solution
SELECT t.*, 
  oldSchool     = t.col1+','+t.col2,
  [using STUFF] = STUFF(t.col1+'x',LEN(t.col2)+1,LEN(t.col2),','+t.col2)
FROM   @t AS t;
0 голосов
/ 28 апреля 2020

Вы можете попробовать как указано ниже

DECLARE @concatNames VARCHAR(8000)
SELECT @concatNames = STUFF((Select ','+ GDATA.DISP_NAME + ' ' + MEAS.MEAS_VALUE 
from PT_MEAS as meas 
LEFT JOIN G_DATA as Gdata 
on meas.MEAS_ID = Gdata.MEAS_ID
FOR XML PATH('')),1,1,'');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...