2014-02-14 4 views
31

У меня есть некоторые данные, которые я хотел бы разбить на основе разделителя, который может существовать или не существовать.Разделительная строка T-SQL на основе разделителя

Пример данных:

John/Smith 
Jane/Doe 
Steve 
Bob/Johnson 

Я использую следующий код, чтобы разделить эти данные в именах и фамилиях:

SELECT SUBSTRING(myColumn, 1, CHARINDEX('/', myColumn)-1) AS FirstName, 
     SUBSTRING(myColumn, CHARINDEX('/', myColumn) + 1, 1000) AS LastName 
FROM MyTable 

Результаты, которые я хотел бы:

FirstName---LastName 
John--------Smith 
Jane--------Doe 
Steve-------NULL 
Bob---------Johnson 

Этот код работает просто отлично, пока все строки имеют ожидаемый разделитель, но ошибки, когда строка не делает t:

"Invalid length parameter passed to the LEFT or SUBSTRING function." 

Как можно переписать это для правильной работы?

ответ

42

Может быть, это поможет вам.

SELECT SUBSTRING(myColumn, 1, CASE CHARINDEX('/', myColumn) 
      WHEN 0 
       THEN LEN(myColumn) 
      ELSE CHARINDEX('/', myColumn) - 1 
      END) AS FirstName 
    ,SUBSTRING(myColumn, CASE CHARINDEX('/', myColumn) 
      WHEN 0 
       THEN LEN(myColumn) + 1 
      ELSE CHARINDEX('/', myColumn) + 1 
      END, 1000) AS LastName 
FROM MyTable 
+0

Именно то, что я искал, спасибо ! – Whatevo

+0

Работает отлично !! спасибо – Mikel

4

Попробуйте отфильтровать строки, которые содержат строки с разделителем и работать на тех, кто только как:

SELECT SUBSTRING(myColumn, 1, CHARINDEX('/', myColumn)-1) AS FirstName, 
     SUBSTRING(myColumn, CHARINDEX('/', myColumn) + 1, 1000) AS LastName 
FROM MyTable 
WHERE CHARINDEX('/', myColumn) > 0 

Или

SELECT SUBSTRING(myColumn, 1, CHARINDEX('/', myColumn)-1) AS FirstName, 
     SUBSTRING(myColumn, CHARINDEX('/', myColumn) + 1, 1000) AS LastName 
FROM MyTable 
WHERE myColumn LIKE '%/%' 
4
 
SELECT CASE 
     WHEN CHARINDEX('/', myColumn, 0) = 0 
      THEN myColumn 
     ELSE LEFT(myColumn, CHARINDEX('/', myColumn, 0)-1) 
     END AS FirstName 
    ,CASE 
     WHEN CHARINDEX('/', myColumn, 0) = 0 
      THEN '' 
     ELSE RIGHT(myColumn, CHARINDEX('/', REVERSE(myColumn), 0)-1) 
     END AS LastName 
FROM MyTable 
5

Для тех, кто ищет ответы передних SQL Server функции 2016. Использование String_Split

Например:

DECLARE @tags NVARCHAR(400) = 'clothing,road,,touring,bike' 

SELECT value 
FROM STRING_SPLIT(@tags, ',') 
WHERE RTRIM(value) <> ''; 

Ссылка: https://msdn.microsoft.com/en-nz/library/mt684588.aspx

+0

Я не уверен, что это отвечает на вопрос и не так полезна, как вышеприведенные выше методы CASE. Функция STRING_SPLIT превращает ее в таблицу, которая соединена. Итак, как получить первую позицию «Имя» второй «Фамилия»? Использование Cross-Apply превратило мои ds в несколько строк. Это отличный способ преобразовать данные String в таблицу. Как и OP, я пытаюсь преобразовать один столбец в два столбца. STRING_SPLIT превращает его в две строки и никак не может сказать, какая строка является «первой», «второй», «третьей» (если не работает над). Но это усложняется. – ripvlan

Смежные вопросы