T-SQL SUBSTRING с CHARINDEX в качестве параметра длины - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть ниже sql.Оператор AND после оператора where должен гарантировать, что в имени действительно есть второй пробел, например после второго имени / инициала.Имя в этом столбце в обратном порядке: последнее, первое, среднее.Я пытаюсь схватить имя, которое будет именем во второй позиции, если таковое существует.Я получаю недопустимый параметр длины и не уверен, почему, я думал, что мое предложение AND позаботится об этом.

Образцы данных:

Consultant_Contacted
Sample Name Test
Sample Name S
Name S Sample2

Ожидаемые результаты:

Consultant_Last_Name | Consultant_First_Name
Sample               | Name
Name                 | Sample2

Я забочусь о именах в обратном порядке, ища A.Ordering_pty_name = ''

WHEN A.Ordering_pty_name = ''
AND (CHARINDEX(' ', A.Consultant_Contacted, CHARINDEX(' ', A.Consultant_Contacted) + 1) + 1) > 0
    THEN UPPER(
        RTRIM(
            LTRIM(
                SUBSTRING(
                    A.Consultant_Contacted
                    , CHARINDEX(' ', A.Consultant_Contacted, 1) 
                    --, 100
                    , (
                        CHARINDEX(
                            ' '
                            , A.CONSULTANT_CONTACTED
                            , CHARINDEX(
                                ' '
                                , A.CONSULTANT_CONTACTED
                                ) + 1
                            ) + 1 
                        ) - 
                        (
                        CHARINDEX(
                            ' '
                            , A.CONSULTANT_CONTACTED
                            , 1
                            )
                        )
                    )
                )
            )
        )

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Вы также можете получить желаемые результаты как

CREATE TABLE T(Col varchar(100))

INSERT INTO T VALUES
('Sample Name Test'),
('Sample Name S'),
('Name S Sample2');

WITH C AS(
SELECT Col,
       LEFT(Col, CHARINDEX(' ', Col, 1)-1) As Part1,
       RIGHT(Col, CHARINDEX(' ', REVERSE(Col), 1)-1 ) As Part3
FROM T
),
CC AS
(
  SELECT C.Part1,
     REPLACE(SUBSTRING(C.Col, LEN(C.Part1)+2,  LEN(C.Col)) , C.Part3, '') As Part2, 
     C.Part3
  FROM C
)

SELECT DISTINCT
       Part1 Consultant_Last_Name,
       CASE WHEN LEN(Part2) < LEN(Part3) THEN Part3
            ELSE Part2
       END Consultant_First_Name
FROM CC;
0 голосов
/ 12 декабря 2018

Разбор имен может быть скользким.

Вы можете использовать parsename(), но подход XML кажется мне несколько более интуитивным.

Пример

Declare @YourTable table (Consultant_Contacted varchar(100))
Insert Into @YourTable values
('Sample Name Test'),
('Sample Name S'),
('Name S Sample2')

Select Distinct
       Last_Name  = Pos1
      ,First_Name = case when len(Pos2)=1 then Pos3 else Pos2 end
 From  @YourTable A
 Cross Apply (
                 Select Pos1 = n.value('/x[1]','varchar(100)')
                       ,Pos2 = n.value('/x[2]','varchar(100)')
                       ,Pos3 = n.value('/x[3]','varchar(100)')
                  From  (Select cast('<x>' + replace(A.Consultant_Contacted,' ','</x><x>')+'</x>' as xml) as n) X
             ) B

Возвращает

Last_Name   First_Name
Name        Sample2
Sample      Name
...