SQL查询字符串按分隔符拆分

时间:2018-01-04 19:36:52

标签: mysql sql string

我有一个查询返回一个像year-month-info一样存储的字段。因此,数据的一个例子是2018年2月 - 全页。我需要通过' - '值而不是只返回一列,我会得到三列。

年月文字
2018年2月全页

文本没有固定格式化,捕获必须由' - '符号和数据将始终以这种方式分割。怎么这么容易?

编辑:

这是我的代码

声明@Str varchar(80)

选择@Str = IPDesc 来自vw_MRA_AdContracts

声明@first_dash int = CharIndex(' - ',@ Str,1) 声明@last_dash int = CharIndex(' - ',Reverse(LTrim(Rtrim(@Str))))

选择profileid,OrgName,@ Str,

Substring(@Str, 1, @first_dash-1) as AdYear, 
Substring(@Str, @first_dash+1, Len(@Str)-@first_dash-@last_dash) as AdMonth, 
Substring(@Str, @last_dash+@first_dash, Len(@Str)) as AdSold, 
来自vw_MRA_AdContracts

问题在于,看起来变量并没有循环遍历所有可用记录并抓取一个然后拆分一条记录。因此,对于AdYear,AdMonth和AdSold,我为每个返回记录获得完全相同的值,即使它与该记录不匹配也是如此。

2 个答案:

答案 0 :(得分:0)

你可以尝试这样的事情:

declare @STR varchar(80) = 'WHATEVER-YOUR-STRING IS' 

例如:'2018-February-Full Page'

declare @fist_dash int = CHARINDEX('-',@STR,1)
declare @last_dash int = CHARINDEX('-',REVERSE(LTRIM(RTRIM(@STR))))

select @STR
,[YEAR]=substring(@STR,1,@fist_dash-1)
,[MONTH]=substring(@STR,@fist_dash+1,LEN(@STR)-@fist_dash-@last_dash)
,[TEXT]=substring(@STR,@fist_dash+1+LEN(substring(@STR,@fist_dash+1,LEN(@STR)-@fist_dash-@last_dash+1)),LEN(@STR))

返回:

(No column name)        YEAR     MONTH      TEXT
2018-February-Full Page 2018     February   Full Page
WHATEVER-YOUR-STRING IS WHATEVER YOUR       STRING IS

答案 1 :(得分:0)

另一种方法是使用此查询。如果STRING的参数少于3个,并且第一个参数(Year)是第一个 SUBSTRING_INDEX ,则查询中的 CONCAT 是为了防止错误的结果。

您只需要使用表格中的字段更改字符串。

SELECT
    SUBSTRING_INDEX( SUBSTRING_INDEX( CONCAT("2018-Jan-Hello",'--'), '-', 1),'-',-1) AS 'Year',
    SUBSTRING_INDEX( SUBSTRING_INDEX( CONCAT("2018-Jan-Hello",'--'), '-', 2),'-',-1) AS 'Month',
    SUBSTRING_INDEX( SUBSTRING_INDEX( CONCAT("2018-Jan-Hello",'--'), '-', 3),'-',-1) AS 'Text'; 

<强>示例

MariaDB [(none)]> SELECT
    ->     SUBSTRING_INDEX( SUBSTRING_INDEX( CONCAT("2018-Jan-Hello",'--'), '-', 1),'-',-1) AS 'Year',
    ->     SUBSTRING_INDEX( SUBSTRING_INDEX( CONCAT("2018-Jan-Hello",'--'), '-', 2),'-',-1) AS 'Month',
    ->     SUBSTRING_INDEX( SUBSTRING_INDEX( CONCAT("2018-Jan-Hello",'--'), '-', 3),'-',-1) AS 'Text';
+------+-------+-------+
| Year | Month | Text  |
+------+-------+-------+
| 2018 | Jan   | Hello |
+------+-------+-------+
1 row in set (0.00 sec)

MariaDB [(none)]>
MariaDB [(none)]> SELECT
    ->     SUBSTRING_INDEX( SUBSTRING_INDEX( CONCAT("2018-Jan",'--'), '-', 1),'-',-1) AS 'Year',
    ->     SUBSTRING_INDEX( SUBSTRING_INDEX( CONCAT("2018-Jan",'--'), '-', 2),'-',-1) AS 'Month',
    ->     SUBSTRING_INDEX( SUBSTRING_INDEX( CONCAT("2018-Jan",'--'), '-', 3),'-',-1) AS 'Text';
+------+-------+------+
| Year | Month | Text |
+------+-------+------+
| 2018 | Jan   |      |
+------+-------+------+
1 row in set (0.00 sec)

MariaDB [(none)]>