0

表1

create table test (dname varchar(250))
insert test values('0.1 ML LIDOCAINE HYDROCHLORIDE 10 MG/ML')
select * from test

                  dname
                 -------

0.1 ML LIDOCAINE HYDROCHLORIDE 10 MG/ML

次のようなテーブルがもう1つあります

表-2

create table test1(
unit1 int,
measure1 varchar(20),
drugname varchar(250),
unit2 int,
measure2 varchar(40)
)

今私は古いテーブル名から選択して新しいテーブル名に挿入を使用して、テストテーブルからテスト1テーブルにデータを挿入する必要があります

私の期待される出力は

select * from test1

unit1     measure1     drugname                    unit2      measure2
0.1       ML           LIDOCAINE HYDROCHLORIDE     10           mg/ml

ここで薬名の長さ、つまりLIDOCAINE HYDROCHLORIDE増減する可能性があることに注意してください。ここに投稿された非常に多くの質問が、私の要件に合わないことがわかりました。

この問題の解決策を提供してください。

すでにより単純な問題があるため、提案をしないでください。すでにこのサイトに掲載されている質問と回答を参照したからです。

4

4 に答える 4

3

SQL フィドル

MS SQL Server 2008 スキーマのセットアップ:

create table test (dname varchar(250))
insert test values('0.1 ML LIDOCAINE HYDROCHLORIDE 10 MG/ML')

クエリ 1 :

select left(dname, S1.Pos - 1) as FirstWord,
       substring(dname, S1.Pos + 1, S2.Pos - S1.Pos - 1) as SecondWord,
       substring(dname, S2.Pos+1, len(dname)-S3.Pos-S2.Pos) as WordsInTheMiddle,
       left(right(dname, S3.Pos - 1), S3.Pos - S4.Pos - 1) as SecondButLastWord,
       right(dname, S4.Pos - 1) as LastWord
from test
  cross apply (select charindex(' ', dname)) as S1(Pos)
  cross apply (select charindex(' ', dname, S1.Pos+1)) as S2(Pos)
  cross apply (select charindex(' ', reverse(dname))) as S4(Pos)
  cross apply (select charindex(' ', reverse(dname), S4.Pos+1)) as S3(Pos)

結果

| FIRSTWORD | SECONDWORD |        WORDSINTHEMIDDLE | SECONDBUTLASTWORD | LASTWORD |
-----------------------------------------------------------------------------------
|       0.1 |         ML | LIDOCAINE HYDROCHLORIDE |                10 |    MG/ML |
于 2012-11-26T06:40:42.400 に答える
0

これを試して:

このクエリは少し長いですが、必要に応じて提供されます

select left(dname,charindex(' ',dname)) as unit1,
       substring(dname,charindex(' ',dname)+1,charindex(' ',dname,charindex(' ',dname)+1)-charindex(' ',dname)-1) as measure1,
       substring(dname,charindex(' ',dname,charindex(' ',dname)+1)+1,len(dname)-charindex(' ',reverse(dname),charindex(' ',reverse(dname))+1)-charindex(' ',dname,charindex(' ',dname)+1)+1) as drugname, 
       reverse(substring(reverse(dname),charindex(' ',reverse(dname),charindex(' ',reverse(dname))+1)-2,charindex(' ',reverse(dname),charindex(' ',reverse(dname))+1)-charindex(' ',reverse(dname))-1)) as unit2,
       reverse(left(reverse(dname),charindex(' ',reverse(dname))-1)) as measure2
from test

SQLFiddleデモ

于 2012-11-26T06:35:01.920 に答える
0

この関数を使用して値を分割します

CREATE FUNCTION Splitfunction(@String varchar(8000), @Delimiter char(1))       
returns @temptable TABLE (items varchar(8000))       
as       
begin       
declare @idx int       
declare @slice varchar(8000)       

select @idx = 1       
    if len(@String)<1 or @String is null  return       

while @idx!= 0       
begin       
    set @idx = charindex(@Delimiter,@String)       
    if @idx!=0       
        set @slice = left(@String,@idx - 1)       
    else       
        set @slice = @String       

    if(len(@slice)>0)  
        insert into @temptable(Items) values(@slice)       

    set @String = right(@String,len(@String) - @idx)       
    if len(@String) = 0 break       
end   
return      

end

その後、クエリでその関数を使用します

SELECT i.items FROM dbo.Splitfunction('0.1 ML LIDOCAINE HYDROCHLORIDE 10 MG/ML',' ') AS i

その値を別のテーブルに挿入します。

これはあなたを助けるかもしれませんか?

よろしく

アミット・ビアス

于 2012-11-26T06:25:13.577 に答える
0
    Use DB_Name
GO
if (object_id('splitFields') is not null)
drop function splitFields;
GO
CREATE FUNCTION splitFields(
    @strIds varchar(max) 
)
RETURNS @temp table (unit1 varchar(50),     measure1 varchar(50),drugname varchar(50),unit2 varchar(50),measure2 varchar(50))
AS
BEGIN 
    declare @i int,@j int,@l int,@v bigint;
    SET @i = 0;
    SET @j = 0;
    SET @l = len(@strIds);
    declare @unit1 varchar(50), @measure1 varchar(50),@drugname varchar(50),@unit2 varchar(50),@measure2 varchar(50);
    declare @no int;
    set @no = 0
    while (@j < @l)
    BEGIN
        SET @j = charindex(' ',@strIds,@i+1);
        IF @j = 0 set @j = @l+1;
        SET @v = substring(@strIds,@i+1,@j-@i-1);
        if @no = 0 then set @unit1= @v
        if @no = 1 then set @measure1= @v
        if @no = 2 then set @drugname= @v
        if @no = 3 then set @unit2= @v
        if @no = 4 then set @measure2= @v
        SET @no = @no + 1;
        SET @i = @j;
    END
    insert into @temp(unit1, measure1,drugname,unit2,measure2) values(@unit1, @measure1,@drugname,@unit2,@measure2)
    RETURN ;
END
GO

テストする時間がないので、自分でテストしてください。

于 2012-11-26T06:25:20.413 に答える