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

时间:2018-04-30 11:05:34

标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2012

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 :(得分:3)

哎哟。你只需要凌乱的代码:

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小提琴。

答案 1 :(得分:1)

我会将class EmptyAbstractClass(NonEmptyABC): pass class NonemptyAbstractClass(NonEmptyABC): @abc.abstractmethod def foo(self): pass class NonemptyChild(NonemptyAbstractClass): def foo(self): pass NonemptyChild() # works because "foo" is an abstractmethod EmptyAbstractClass() # throws TypeError because there are no abstractmethods subsring()函数一起使用:

left()

答案 2 :(得分:0)

这也可以。 希望这有用:)

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

答案 3 :(得分:0)

使用与XML Cross

一起使用的小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)

<强>返回

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)