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)
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)