Sql 查询将字符串拆分为 SQL 中的 2 列

Sql Query to split the string into 2 columns in SQL

SQL 中的以下字符串需要根据

清除和清除的关键字进行拆分
Paper Industry cleared by SBI
Chemical Industry cleared by HDFC
SBI clearing for automobile Industry
ICICI clearing for textile industry

我需要根据 cleared by 和 clearing for 的关键字拆分上面的字符串以获得 2 列的输出

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

获取 2 列公司名称并更清晰。

分割它并在 SQL 中获取 table 值结果的最佳方法是什么。

SQL查询会有帮助。

哎呀。你只需要乱码:

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;

Here 是 SQL Fiddle.

我会使用 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

这也行。 希望这对您有所帮助:)

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

只是另一个选项,使用一点点 XML 与交叉应用

例子

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

EDIT - Just for Fun and if the source is One Multi-Line String

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)