Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL按分隔符拆分字符串_Sql - Fatal编程技术网

SQL按分隔符拆分字符串

SQL按分隔符拆分字符串,sql,Sql,我在SQL表中有一列,其中包含以下格式的字符串: Provider - Category: General: Entry (1) 我想创建一个SQL语句,将其拆分为4列,结果如下: Column1 | Column2 | Column3 | Column4 ---------------------------------------------- Provider | Category | General: Entry | 1 它需要按-,然后按第一个:,然后按(,最后删

我在SQL表中有一列,其中包含以下格式的字符串:

Provider - Category: General: Entry (1)
我想创建一个SQL语句,将其拆分为4列,结果如下:

Column1  | Column2  | Column3        | Column4
----------------------------------------------
Provider | Category | General: Entry | 1
它需要按
-
,然后按第一个
,然后按
,最后删除
进行拆分


如何创建类似的内容?

如果数据具有相同的结构,则此查询应该可以工作:

DECLARE @TEXT VARCHAR(255) = 'Provider - Category: General: Entry (1)';

SELECT SUBSTRING(@TEXT,1,CHARINDEX('-',@TEXT)-1) AS COL1
,SUBSTRING(@TEXT,CHARINDEX('-',@TEXT)+2,CHARINDEX(':',@text)- 2 - CHARINDEX('-',@text))  AS COL2
,SUBSTRING(@TEXT,CHARINDEX(':',@TEXT)+2,CHARINDEX('(',@TEXT)- 2 - CHARINDEX(':',@TEXT)) AS COL3
,SUBSTRING(@TEXT,CHARINDEX('(',@TEXT)+1,CHARINDEX(')',@TEXT)- 1 - CHARINDEX('(',@TEXT)) AS COL4
输出:

Col1        Col2        Col3             Col4
Provider    Category    General: Entry      1
根据评论进行编辑:

DECLARE @TEXT VARCHAR(255) = 'Provider - Category: General: Entry (HD) (1)';

SELECT SUBSTRING(@TEXT,1,CHARINDEX('-',@TEXT)-1) AS COL1
,SUBSTRING(@TEXT,CHARINDEX('-',@TEXT)+2,CHARINDEX(':',@text)- 2 - CHARINDEX('-',@text))  AS COL2
,SUBSTRING(@TEXT,CHARINDEX(':',@TEXT)+2,CHARINDEX('(',@TEXT)- 2 - CHARINDEX(':',@TEXT)) AS COL3
--,SUBSTRING(@TEXT,CHARINDEX('(',@TEXT)+1,CHARINDEX(')',@TEXT)- 1 - CHARINDEX('(',@TEXT)) AS COL4
,REVERSE(SUBSTRING(REVERSE(@TEXT),2,CHARINDEX('(',(REVERSE(@TEXT))) - CHARINDEX(')',REVERSE(@TEXT))-1)) as COL4
这样,无论您是否有
'Provider-Category:General:Entry(HD)(1)
'Provider-Category:General:Entry(HD)(1)
,输出都是:

Col1        Col2        Col3             Col4
Provider    Category    General: Entry      1

它唯一不包含
(HD)
。但是,您可以将这两种解决方案与
@文本(不象“%HD%”)和
@文本(象“%HD%”)结合起来,然后使用UNION ALL作为解决方法。

您使用的是哪种数据库管理系统?数据是否总是相同的?或者他们可以改变?如果标点符号可能会改变或不改变。使用SQL 2012,我注意到有时数据中可能会有另一组括号,在
General:Entry(HD)(1)
中,如果它们是相同的,看起来很好,但对于类似
Provider-Category:General:Entry(HD)(1)
的内容,有时会发生,将在最后一列中放置HD而不是1,其中第3列应为
General:Entry(HD)
。有没有办法将最后一个子字符串改为lastIndexOf”(“?请参阅更新的答案。这有多重要?”(HD)?我认为这些查询可以为您提供实现任务的基本方法。