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