테이블의 해당 컬럼이 GEOMETRY타입으로 LINESTRING (X Y Z, X Y Z...)이 들어가 있습니다.
해당 LINESTRING의 Z값을 전부 -1해주고 싶습니다.
현재는 CURSOR, WHILE문 돌면서 행별로 일일이 돌면서 Z값 수정해주고 LINESTRING 다시 만들어서 넣고 있습니다.
좋은 방법이 있을까요?
Comment 2
-
건우아빠
2019.01.30 13:27
/*함수 만들어서 이용하시는 방법이 가장 편할듯합니다.http://www.sqler.com/145575 함수*/with res as(select 1 no , '1 2 3,3 4 5,6 7 8' LINESTRING union allselect 2 no , '11 22 13,13 344 55,16 57 18' LINESTRING) , res2 as(SELECT a.no,B.NUM , REPLACE(a.LINESTRING ,' ','/') LINESTRING ,rtrim(ltrim(DBO.MssqlINSTR(REPLACE(a.LINESTRING ,' ','/'),',',B.NUM))) DATAFROM res AS ACROSS APPLY(SELECT NUMBER + 1 NUMFROM MASTER.DBO.SPT_VALUESWHERE TYPE = 'P'AND NUMBER <= (LEN(A.LINESTRING) - LEN(REPLACE(A.LINESTRING ,',','')) ) ) AS B) , res3 as(select top 100 percent A.no ,A.NUM ,A.LINESTRING ,A.DATA , b.NUM num2 , case when b.NUM = 3 then -1 else DBO.MssqlINSTR(A.DATA,'/',B.NUM) end DATA2from res2 AS ACROSS APPLY(SELECT NUMBER + 1 NUMFROM MASTER.DBO.SPT_VALUESWHERE TYPE = 'P'AND NUMBER <= (LEN(A.LINESTRING) - LEN(REPLACE(A.LINESTRING ,'/','')) ) ) AS Bwhere DBO.MssqlINSTR(A.DATA,'/',B.NUM) <> ' 'order by A.no ,A.NUM , b.NUM ) ,res4 as (select no ,NUM ,LINESTRING, DATA , convert(varchar,max(case when num2 = 1 then data2 end)) +' '+ convert(varchar,max(case when num2 = 2 then data2 end)) +' '+ convert(varchar,max(case when num2 = 3 then data2 end )) LINEdatafrom res3group by no ,NUM ,LINESTRING, DATA )select no , max(case when NUM = 1 then LINEdata end) +','+ max(case when NUM = 2 then LINEdata end) +','+ max(case when NUM = 3 then LINEdata end ) NewLINESTRINGfrom res4group by no -
으버미
2019.01.31 08:42
좋은 내용 감사합니다!!