Мне кажется, что вы не понимаете, что на самом деле делает 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
, чтобы связать его с результатом.