2013-08-21 181 views
0

我有药物的定义列。我希望定义分为[product name(PN)],[doseform(DF)],[total dose(TD)][units]。 例如:如何将字符串列拆分为4个字符串列?

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)) 

回答

1

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

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

这里的区别是,该函数将返回一个2列的表,所以我们可以识别的定义部分

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 

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

SUBSTRING(medication, CHARINDEX('(', medication) + 1, LEN(medication) - (CHARINDEX('(', medication) + 1)) 

然后PIVOT结果来压平:

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