首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AlphaNumeric上的拆分值更改为多行

AlphaNumeric上的拆分值更改为多行
EN

Stack Overflow用户
提问于 2017-12-11 21:27:38
回答 2查看 75关注 0票数 1

我有一个存储过程的以下输出,我正在尝试拆分Valueasstring,它在数值和alpha之间切换到它自己的行中,并更新了两个值:

代码语言:javascript
复制
Acct    Valuetypename   Valueasstring   EffectiveDate
123     Accepted        150ABC          8/15/2017
234     Accepted        500DF           10/17/2017
345     Accepted        1000ABC         10/17/2017
456     Accepted        25PV            10/3/2017
567     Accepted        100PV           8/15/2017

我试着用一个设置字符来拆分,就像使用XML的逗号一样,但是在类型更改时却陷入了困境。我不打算使用XML。

代码语言:javascript
复制
Select a.Acct, a.Valuetypename, b.Valueasstring as ValueAsString, a.EffectiveDate
FROM
(
    SELECT *,
    CAST('<X>'+replace(T.Valueasstring,',','</X><X>')+'</X>' as XML) as my_Xml 
    FROM MyTable T
) a
CROSS APPLY
(
    SELECT my_Data.D.value('.','varchar(50)') as Valueasstring
    FROM a.my_Xml.nodes('X') as my_Data(D)
) b

我想要实现的是,多行,valuetypename改为alpha值,Valueasstring改为1(是)。

代码语言:javascript
复制
Acct    Valuetypename   Valueasstring   EffectiveDate
123     ABC             1               8/15/2017
123     Accepted        150             8/15/2017
234     DF              1               10/17/2017
234     Accepted        500             10/17/2017
345     ABC             1               10/17/2017
345     Accepted        1000            10/17/2017
456     PV              1               10/3/2017
456     Accepted        25              10/3/2017
567     PV              1               8/15/2017
567     Accepted        100             8/15/2017

在我的代码中,我只能找到如何在设置字符上分隔逗号。但在我的情况下,我没有设定字符,甚至没有一个空格,只是从阿尔法切换到数字,反之亦然。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-12 04:47:52

首先,您可以用逗号,分隔它们。( (i.e. 150, ABC)通过使用stuff()函数。

代码语言:javascript
复制
select 
       a.Acct,
       case when ISNUMERIC(m.value('.', 'varchar(max)')) <> 1 then m.value('.', 'varchar(max)') else a.Valuetypename end [Valuetypename],
       case when ISNUMERIC(m.value('.', 'varchar(max)')) <> 1 then '1' else m.value('.', 'varchar(max)') end [Valueasstring],
       a.EffectiveDate from
(
    SELECT *, CAST('<m>'+replace(STUFF(Valueasstring,PATINDEX('%[A-Z]%', Valueasstring),0,','),',','</m><m>')+'</m>' as XML) as my_Xml  FROM  MyTable 
)a cross apply my_Xml .nodes('/m') as Valueasstring(m)

并且,借助简单的isnumeric()表达式通过case函数检查数值。

结果:

代码语言:javascript
复制
Acct    Valuetypename   Valueasstring   EffectiveDate
123     ABC             1               8/15/2017
123     Accepted        150             8/15/2017
234     DF              1               10/17/2017
234     Accepted        500             10/17/2017
345     ABC             1               10/17/2017
345     Accepted        1000            10/17/2017
456     PV              1               10/3/2017
456     Accepted        25              10/3/2017
567     PV              1               8/15/2017
567     Accepted        100             8/15/2017
票数 1
EN

Stack Overflow用户

发布于 2017-12-12 08:12:45

如果没有分隔字符,就不能使用拆分,但可以使用PATINDEX查找模式的第一次出现:

代码语言:javascript
复制
SET DATEFORMAT mdy;
DECLARE @mockupTable TABLE(Acct INT,Valuetypename VARCHAR(100),Valueasstring VARCHAR(100),EffectiveDate DATE);
INSERT INTO @mockupTable VALUES
 (123,'Accepted','150ABC','8/15/2017')
,(234,'Accepted','500DF','10/17/2017')
,(345,'Accepted','1000ABC','10/17/2017')
,(456,'Accepted','25PV','10/3/2017')
,(567,'Accepted','100PV','8/15/2017');

查询使用CROSS APPLY作为命名变量获取职位的值。可以将PATINDEX放在查询中两次,但更好的做法是:

代码语言:javascript
复制
SELECT m.Acct
      ,m.Valuetypename
      ,LEFT(Valueasstring,FirstAlpha.Position-1) AS Numpart
      ,SUBSTRING(Valueasstring,FirstAlpha.Position,4000) AS Restpart
      ,m.EffectiveDate
FROM @mockupTable AS m
CROSS APPLY (SELECT PATINDEX('%[a-zA-Z]%',m.Valueasstring) AS Position) AS FirstAlpha

结果

代码语言:javascript
复制
Acct              Numpart   Restpart    EffectiveDate
123     Accepted    150     ABC         2017-08-15
234     Accepted    500     DF          2017-10-17
345     Accepted    1000    ABC         2017-10-17
456     Accepted    25      PV          2017-10-03
567     Accepted    100     PV          2017-08-15

可以使用简单的CAST (... AS INT)将Numpart转换为数字。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47761698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档