首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将一个字符串列拆分成4个字符串列?

如何将一个字符串列拆分成4个字符串列?
EN

Stack Overflow用户
提问于 2013-08-22 07:04:23
回答 1查看 87关注 0票数 0

我有一个药物的定义栏。我希望将定义分为[product name(PN)][doseform(DF)][total dose(TD)][units]。例如:

代码语言:javascript
复制
BENADRYL: MYLANTA 1:1 SOLUTION(Benadryl mylanta(PN),Sol(DF),1:1(TD),NULL(units))
MASK AND SPACER (Mark and Spacer(PN),NUll,NUll,NUll)
BL VITAMIN B-6 50 MG  TABS(BL Vitamin(PN),Tabs(DF),50(TD),MG(Units))
EN

回答 1

Stack Overflow用户

发布于 2013-08-22 07:52:22

我对你的数据做了一些假设。1是第一个左方括号开始定义,即。在定义之前的名称中没有括号。我还假设产品定义结构不会改变。

因此,为了得到您的答案,我使用了一个经过修改的拆分字符串函数。我使用这个作为基础:T-SQL split string

这里的不同之处在于,该函数将返回一个两列的表,以便我们可以标识定义部分

代码语言:javascript
复制
CREATE FUNCTION dbo.splitstring_custom
  (
   @stringToSplit VARCHAR(MAX)
  )
RETURNS @returnList TABLE
  (
   [Type] [nvarchar](20)
  ,[Name] [nvarchar](500)
  )
AS 
BEGIN

    DECLARE @name NVARCHAR(255)
    DECLARE @pos INT
    DECLARE @colidx INT = 1

    WHILE CHARINDEX(',', @stringToSplit) > 0 
          BEGIN
                SELECT  @pos = CHARINDEX(',', @stringToSplit)  
                SELECT  @name = SUBSTRING(@stringToSplit, 1, @pos - 1)

                INSERT  INTO @returnList
                        SELECT  CASE WHEN @colidx = 1 THEN 'Product Name'
                                     WHEN @colidx = 2 THEN 'Dose Form'
                                     WHEN @colidx = 3 THEN 'Total Dose'
                                     WHEN @colidx = 4 THEN 'Units'
                                END
                               ,@name

                SELECT  @stringToSplit = SUBSTRING(@stringToSplit, @pos + 1, LEN(@stringToSplit) - @pos)
                SET @colidx += 1
          END

    INSERT  INTO @returnList
            SELECT  CASE WHEN @colidx = 1 THEN 'Product Name'
                         WHEN @colidx = 2 THEN 'Dose Form'
                         WHEN @colidx = 3 THEN 'Total Dose'
                         WHEN @colidx = 4 THEN 'Units'
                    END
                   ,@stringToSplit

    RETURN
END

然后,我们使用一些字符串操作来获得定义的相关部分:

代码语言:javascript
复制
SUBSTRING(medication, CHARINDEX('(', medication) + 1, LEN(medication) - (CHARINDEX('(', medication) + 1))

然后对结果执行PIVOT操作以将其展平:

代码语言:javascript
复制
DECLARE @t TABLE (id varchar(20), medication varchar(100))

INSERT INTO @t VALUES ('BENADRYL', 'BENADRYL: MYLANTA 1:1 SOLUTION(Benadryl mylanta(PN),Sol(DF),1:1(TD),NULL(units))')
INSERT INTO @t VALUES ('MASK', 'MASK AND SPACER (Mark and Spacer(PN),NULL,NULL,NULL)')
INSERT INTO @t VALUES ('BL VITAMIN', 'BL VITAMIN B-6 50 MG  TABS(BL Vitamin(PN),Tabs(DF),50(TD),MG(Units))')

SELECT  id, [Product Name], [Dose Form], [Total Dose], [Units]
FROM    (SELECT id, Type, Name
         FROM   @t t
         CROSS APPLY dbo.splitstring_custom(SUBSTRING(medication, CHARINDEX('(', medication) + 1, LEN(medication) - (CHARINDEX('(', medication) + 1)))
        ) X PIVOT ( MAX(Name) FOR TYPE IN ([Product Name], [Dose Form], [Total Dose], [Units]) ) pvt
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18369065

复制
相关文章

相似问题

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