Ведущее пространство с функцией STR

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

select stuff((select distinct ','+''''+str(bid)+'''' from dbo.Companies
where IdCompany in (select substring(ID_COMPANY,1,LEN(ID_COMPANY)-2)  from
sql.Companies where SEGMENT = @Segment and STATE = 'ACTIVE')
FOR XML PATH('')) , 1 , 1 , '' )

Я получаю что-то вроде этого:

' 500004600',' 500005200',' 500009600',' 500021500'

Как удалить левое пространство, чтобы я просто получил:

'500004600','500005200','500009600','500021500'

DDL и демонстрационные данные значительно упростили бы эту задачу. Есть ли в ваших данных начальный пробел?

Sean Lange 13.05.2022 00:15

Почему вы используете str(bid)? Каков тип данных bid? Вы пробовали LTRIM(bid) вместо этого? Кроме того, если это целые числа, QUOTENAME(LTRIM(bid), char(39)) намного аккуратнее и проще для глаз и мозга, чем '+'''''… подсчет одинарных кавычек действительно отстой.

Aaron Bertrand 13.05.2022 00:21

Задавая вопрос, вам необходимо предоставить минимальный воспроизводимый пример: (1) DDL и набор выборочных данных, т. е. таблицы CREATE плюс операторы INSERT T-SQL. (2) Что вам нужно сделать, т. е. логика и ваш код попытаются реализовать ее в T-SQL. (3) Желаемый результат, основанный на примерных данных в # 1 выше. (4) Ваша версия SQL Server (SELECT @@version;).

Yitzhak Khabinsky 13.05.2022 00:24

Кроме того, если вы используете SQL Server 2017 или более позднюю версию (всегда полезно указать на самом деле), откажитесь от FOR XML PATH и STUFF в пользу STRING_AGG. См. sqlperformance.com/2022/02/t-sql-queries/…

Aaron Bertrand 13.05.2022 00:25

Какая у вас версия SQL Server? select @@version

Charlieface 13.05.2022 01:58

Это SQL Server 2008

ffuentes 13.05.2022 04:11

Ицхак, это просто колонка с кодами. Нет необходимости в дополнительных объяснениях. Любой, кто имел дело с функциейstuff, знает, что происходит.

ffuentes 13.05.2022 04:13
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
7
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это задокументировано в функции STR()

length

Is the total length. This includes decimal point, sign, digits, and spaces. The default is 10.

Вы не указали значение, поэтому оно равно 10.

Вместо этого вы должны CAST номер varchar. Более простой вариант, когда у вас все равно есть конкатенация, — использовать CONCAT, который также приведет ее.

You should also remove the DISTINCT and use GROUP BY bid, otherwise indexes and other optimizations cannot be used (because of the concatenation).

SELECT STUFF((
    SELECT CONCAT(',''', c.bid, '''')
    FROM dbo.Companies c
    WHERE c.IdCompany in (
        SELECT SUBSTRING(c2.ID_COMPANY, 1, LEN(c2.ID_COMPANY) - 2)
        FROM sql.Companies c2
        WHERE c2.SEGMENT = @Segment
          AND c2.STATE = 'ACTIVE'
    )
    GROUP BY
      c.bid
    FOR XML PATH('')
  ) , 1 , LEN(',') , '' )

В качестве побочного пункта, если вы объединяете строки, которые могут иметь проблемы с экранированием XML, вам понадобится

    FOR XML PATH(''), TYPE
  ).value('text()[1]','varchar(max)') , 1 , LEN(',') , '' )

Очевидно, что в более новых версиях SQL Server вы можете просто использовать STRING_AGG

 SELECT STRING_AGG(CONCAT('''', c.bid, ''''), ',')
 FROM dbo.Companies c
 WHERE c.IdCompany in (
     SELECT SUBSTRING(c2.ID_COMPANY, 1, LEN(c2.ID_COMPANY) - 2)
     FROM sql.Companies c2
     WHERE c2.SEGMENT = @Segment
       AND c2.STATE = 'ACTIVE'
 )
 GROUP BY
   c.bid

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

Похожие вопросы