Как разделить строковый SQL с на? - PullRequest
1 голос
/ 11 июня 2019

как разделить одно значение из sql?

EX: столбец SQL

image

Теперь я хочу разделить на

image

Код:

declare @ND nvarchar(max)= N'AA (AA11) [37100]'
select substring(@ND,1,patindex('%[0-9]%',@ND)-2) as Name
      ,substring(@ND,patindex('%[0-9]%',@ND),len(@ND)) as Number

Ответы [ 4 ]

1 голос
/ 11 июня 2019

В ваших данных образца последние 6 символов всегда являются квадратными скобками с номером.Если это всегда так, вы можете использовать более простую логику:

select left(fullname, len(fullname) - 7),
       left(right(fullname, 5), 4)
from @t;

Здесь - это дБ <> скрипка.

В более общем случае я бытакже хочу обработать ситуацию, когда в строке нет [ без генерирования ошибки:

select left(fullname, charindex('[', fullname + '[') - 1),
       replace(stuff(fullname, 1, charindex('[', fullname + '['), ''), ']', '')
from @t;

Здесь - это еще одна дБ <> скрипка.

1 голос
/ 11 июня 2019
Declare @t table (fullname varchar(50))

insert into @t values ('AA [1111]')
insert into @t values ('BB(15CC) [2222]')

select 
    fullname,
    substring(fullname,1,CHARINDEX('[',fullname)-1) Name,
    replace(substring(fullname,CHARINDEX('[',fullname)+1,len(fullname)),']','') as number 
from @t
0 голосов
/ 11 июня 2019

Используя преобразование Xml, мы можем получить ожидаемый результат

Declare @t table (fullname varchar(50))
insert into @t values ('AA [1111]')
insert into @t values ('BB(15CC) [2222]')


SELECT DISTINCT Fullname,
       Split.a.value('/S[1]','nvarchar(100)') AS Name,
       Split.a.value('/S[2]','nvarchar(100)') AS Number
FROM
(
SELECT Fullname,
        CAST('<S>'+REPLACE(REPLACE(REPLACE(Fullname,' ','</S><S>')+'</S>','[',''),']','') AS XML ) AS FullnameData
FROM @t
)AS A
CROSS APPLY FullnameData.nodes('S') AS Split(a)

Результат

Fullname            Name        Number
----------------------------------------
AA [1111]           AA          1111
BB(15CC) [2222]     BB(15CC)    2222
0 голосов
/ 11 июня 2019

Вы можете сделать это, используя функции CHARINDEX(), REPLACE(), LEN() и SUBSTRING() в качестве

SELECT Str FullName,
       REPLACE(Str, SUBSTRING(Str, CHARINDEX('[', Str), CHARINDEX(']', Str)), '') Name,
       SUBSTRING(Str, CHARINDEX('[', Str) + 1, LEN(Str) - CHARINDEX('[', Str)-1) Number
FROM (VALUES('BBB(15CC)[222]'), ('AA[1111]')) T(Str);

OR

;WITH CTE AS
(
  SELECT Str FullName,
         LEFT(Str, CHARINDEX('[', Str) -1) Name
  FROM (VALUES('BBB(15CC)[222]'), ('AA[1111]')) T(Str)
)
SELECT FullName,
       Name,
       REPLACE(REPLACE(FullName, Name + '[', ''), ']', '') Number
FROM CTE;

Возвращает:

+----------------+-----------+--------+
|    FullName    |   Name    | Number |
+----------------+-----------+--------+
| BBB(15CC)[222] | BBB(15CC) |    222 |
| AA[1111]       | AA        |   1111 |
+----------------+-----------+--------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...