Sql Query для разделения строки на 2 столбца в SQL - PullRequest
0 голосов
/ 30 апреля 2018

Ниже строка в SQL должна быть разделена на основе ключевых слов, очищенных и очищаемых для

Paper Industry cleared by SBI
Chemical Industry cleared by HDFC
SBI clearing for automobile Industry
ICICI clearing for textile industry

Мне нужно разбить приведенную выше строку на основе очищенных и очищенных ключевых слов, чтобы получить выходные данные в 2 столбцах

Output 
Company Name             | Clearer
------------------------------------------
Paper Industry           | SBI
Chemical Industry        | HDFC
automobile Industry      | SBI
textile industry         | ICICI

, чтобы получить 2 столбца название компании и понятнее.

Каков наилучший способ разделить это и получить результат с табличным значением в SQL.

Запрос SQL будет полезен.

Ответы [ 4 ]

0 голосов
/ 30 апреля 2018

Просто еще один вариант использования небольшого XML в сочетании с Cross Apply

* ** 1003 тысяча два * Пример
Declare @YourTable Table (id int,[SomeCol] varchar(50))
Insert Into @YourTable Values 
 (1,'Paper Industry cleared by SBI')
,(2,'Chemical Industry cleared by HDFC')
,(3,'SBI clearing for automobile Industry')
,(4,'ICICI clearing for textile industry')


Select CompanyName = XMLData.value('x[1]/@name','varchar(max)')
      ,Clearer     = XMLData.value('x[1]/@code','varchar(max)')
 From @YourTable A
 Cross Apply ( values ( convert(xml,case when charindex('cleared by',SomeCol)>0 
                                    then '<x name="'+replace(SomeCol,' cleared by '  ,'" code="')+'"/>'
                                    else '<x code="'+replace(SomeCol,' clearing for ','" name="')+'"/>'
                                    end) )
             ) B(XMLData)

Returns

CompanyName         Clearer
Paper Industry      SBI
Chemical Industry   HDFC
automobile Industry SBI
textile industry    ICICI

РЕДАКТИРОВАТЬ - просто для удовольствия, и если источником является одна многострочная строка

Declare @S varchar(max) ='Paper Industry cleared by SBI
Chemical Industry cleared by HDFC
SBI clearing for automobile Industry
ICICI clearing for textile industry'


Select CompanyName = XMLData.value('x[1]/@name','varchar(max)')
      ,Clearer     = XMLData.value('x[1]/@code','varchar(max)')
 From (
        Select RetVal = B.i.value('(./text())[1]', 'varchar(max)')
        From  (Select x = Cast('<x>' + replace(@S,char(13)+char(10),'</x><x>')+'</x>' as xml).query('.')) as A 
        Cross Apply x.nodes('x') AS B(i)
      ) A
 Cross Apply ( values ( convert(xml,case when charindex('cleared by',RetVal)>0 
                                    then '<x name="'+replace(RetVal,' cleared by '  ,'" code="')+'"/>'
                                    else '<x code="'+replace(RetVal,' clearing for ','" name="')+'"/>'
                                    end ) )
             ) B(XMLData)
0 голосов
/ 30 апреля 2018

Я бы использовал subsring() с left() функцией:

select 
       (case when company like '% cleared by %'
             then left(company, charindex(' cleared by ', company))
             else substring(company, charindex('clearing for ', company)+13, LEN(company))
        end) as [Company Name],
       (case when company like '% cleared by %'
             then substring(company, charindex('cleared by ', company)+11, LEN(company))
             else left(company, charindex(' clearing for ', company))
        end) as Clearer
from table t
0 голосов
/ 30 апреля 2018

Это тоже будет работать. Надеюсь, что это полезно:)

SELECT 
    CASE
        WHEN [Left] LIKE '%industry' 
        THEN [Left]
        ELSE [Right]
        END [Company Name]
    ,CASE
        WHEN [Left] NOT LIKE '%industry' 
        THEN [Left]
        ELSE [Right]
        END [Clearer]
    FROM
    (
    SELECT 
        CASE 
            WHEN CHARINDEX(' cleared by ', Col) > 0
            THEN LTRIM(RTRIM(LEFT(Col, CHARINDEX(' cleared by ', Col))))
            WHEN CHARINDEX(' clearing for ', Col) > 0
            THEN LTRIM(RTRIM(LEFT(Col, CHARINDEX(' clearing for ', Col))))
            END [Left]
        ,CASE 
            WHEN CHARINDEX(' cleared by ', Col) > 0
            THEN LTRIM(RTRIM(SUBSTRING(Col, CHARINDEX(' cleared by ', Col)+LEN(' cleared by '), LEN(Col))))
            WHEN CHARINDEX(' clearing for ', Col) > 0
            THEN LTRIM(RTRIM(SUBSTRING(Col, CHARINDEX(' clearing for ', Col)+LEN(' clearing for '), LEN(Col))))
            END [Right]
        FROM table_name
    ) T
0 голосов
/ 30 апреля 2018

Уч. Вам просто нужен грязный код:

select t.*,
       (case when col like '% cleared by %'
             then left(col, charindex(' cleared by ', col))
             else stuff(col, 1, charindex(' clearing for ', col) + 13, '')
        end) as company_name,
       (case when col like '% cleared by %'
             then stuff(col, 1, charindex(' cleared by ', col) + 11, '')
             else left(col, charindex(' clearing for ', col))
        end) as clearer
from t;

Здесь - это скрипта SQL.

...