Получить строку из предложения с появлением другой строки - PullRequest
0 голосов
/ 10 января 2020

У меня есть таблица со столбцом Col1, который имеет значения, как показано ниже:

SELECT 'XXX-T09-CFO Signature' AS  Col1
UNION 
SELECT 'YYY-T140 - Update Funding Authorization Status to Completed'
UNION 
SELECT'ZZZ-T13-PAB Chair Signature'

Мой вывод col2 должен содержать строку перед словом "Signature" из col1.Если слово Signature не найдено, оно должно быть установленным в NULL

SELECT 'XXX-T09-CFO Signature' AS  Col1,'CFO' as Col2
UNION 
SELECT 'YYY-T140 - Update Funding Authorization Status to Completed' ,Null
UNION 
SELECT'ZZZ-T13-PAB Chair Signature','PAB Chair' 

Ответы [ 2 ]

0 голосов
/ 13 января 2020

Во-первых, вы должны знать, что 2008 и 2008r2 больше не поддерживаются . Срок их расширенной поддержки закончился в прошлом году - 9 июля 2019 года.
Вы должны серьезно рассмотреть вопрос об обновлении версии SQL Server (обратите внимание, что 2012 год также выходит из расширенной поддержки через пару лет - 12 июля 2022 года.)

При этом, вот решение, которое будет работать на 2008r2, а также на всех поддерживаемых в настоящее время версиях - с использованием комбинации case, charindex, right и reverse:

WITH SourceTable AS
(
    SELECT 'XXX-T09-CFO Signature' AS  Col1
    UNION 
    SELECT 'YYY-T140 - Update Funding Authorization Status to Completed'
    UNION 
    SELECT'ZZZ-T13-PAB Chair Signature'
), CTE AS
(
    SELECT Col1,
           SUBSTRING(Col1, 0, CHARINDEX('Signature', Col1)) As BeforeSignature
    FROM SourceTable
)

SELECT  Col1, 
        CASE WHEN BeforeSignature = '' THEN 
            NULL 
        ELSE 
            RIGHT(BeforeSignature, CHARINDEX('-', REVERSE(BeforeSignature))-1)
        END As Col2
FROM CTE

Результаты:

Col1                                                            Col2
XXX-T09-CFO Signature                                           CFO 
YYY-T140 - Update Funding Authorization Status to Completed     NULL
ZZZ-T13-PAB Chair Signature                                     PAB Chair
0 голосов
/ 10 января 2020

Я думаю, вы хотите использовать STRING_SPLIT: https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql?view=sql-server-ver15&viewFallbackFrom=sql-server-previousversions

Я покажу, как использовать его один раз (без тестирования), но вы можете использовать его дважды, чтобы получить то, что вы хотите, один раз разделив на да sh и один раз на пробел

SELECT Word
FROM
    (
     SELECT 'XXX-T09-CFO Signature' AS Word,ROW_NUMBER()OVER(ORDER BY (SELECT NULL)) RN
     FROM STRING_SPLIT(@Var, '-')
    ) T
WHERE RN == 3;

Изменено с { ссылка }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...