4

ジオフェンス (ポリゴン) を定義する緯度/経度座標の文字列を含むフィールドがあります。それぞれコンマで区切ります。

eg: 'lat,long,lat,long,lat,long'
eg: 148.341158,-21.500773,148.341406,-21.504989,148.375136,-21.513174,148.401674,-21.535247,148.418044,-21.532767,148.408867,-21.511685,148.414075,- 21.508461,148.36968,-21.432567,148.349094,-21.438768,148.346862,-21.480187,148.341158,-21.500773,

MSSQL ( http://msdn.microsoft.com/en-us/library/bb933971.aspx )の geography タイプでこれを使用したいと思います。

DECLARE @g geography;
SET @g = geography::STPolyFromText('POLYGON((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326);
SELECT @g.ToString();

これには、「緯度経度、緯度経度、緯度経度」が必要なようです。つまり、ペアの間にコンマはありません。

ベンダー プログラムで使用されているため、ソース データを変更できません。文字列を操作して 2 つのコンマのうち 1 つを削除するか、それが失敗した場合は、TSQL で正規表現を機能させる必要があります

4

5 に答える 5

2

これが私の解決策になりました:

DECLARE @WorkingCoordList VARCHAR(max) = 'some lat,long,lat,long string'
DECLARE @Processed INT = 0
DECLARE @CommaLoc INT
DECLARE @Count INT = 0

WHILE @Processed = 0        
    BEGIN       
        SET @CommaLoc = PATINDEX('%,%', @WorkingCoordList)  

        IF @Count % 2 = 0   
        BEGIN   
            SET @WorkingCoordList = STUFF(@WorkingCoordList, @CommaLoc, 1, ' ') --Convert comma to space
        END 
        ELSE    
        BEGIN   
            SET @WorkingCoordList = STUFF(@WorkingCoordList, @CommaLoc, 1, '#') -- Convert comma to hash
        END 

        IF @CommaLoc = LEN(@WorkingCoordList)   
        BEGIN   
            SET @WorkingCoordList = LEFT(@WorkingCoordList, LEN(@WorkingCoordList) - 1)  -- trim trailing ,
            SET @WorkingCoordList = RTRIM(LTRIM(REPLACE(@WorkingCoordList, '#', ', '))) -- Convert all the hashes to commas
            SET @Processed = 1
        END 

        SET @Count = @Count + 1 
    END 
END
于 2016-10-13T05:08:34.013 に答える
2

数値表(ちなみに、多くの目的で非常に便利なツール)使用して、すべてのコンマの位置を見つけ、奇数の位置番号のみを使用して、単一の SELECT ステートメントで対応するコンマをスペースに置き換えることができます。これが私が話していることです:

WITH commas AS (
  SELECT number, rn = ROW_NUMBER() OVER (ORDER BY number)
  FROM master.dbo.spt_values
  WHERE type = 'P'
    AND number BETWEEN 1 AND LEN(@coords)
    AND SUBSTRING(@coords, number, 1) = ','
)
SELECT
  @coords = STUFF(@coords, number, 1, ' ')
FROM cte
WHERE rn % 2 = 1
;

上記のクエリでは、numbers テーブルの「部分」がsystem テーブルmaster.dbo.spt_valuesのサブセットによって「再生」されます。commas CTEは文字列内のすべてのコンマの位置を計算し、@coords結果を行セットとして返します。メインの SELECT は代入ステートメントとして使用されます。numberセット内のすべてを取り、内commasの対応する位置にある文字を削除し@coordsて、スペース文字に置き換えます (すべてSTUFF関数を使用します)。

このSQL Fiddle デモを使用して、クエリを試すことができます。

于 2013-10-08T07:01:08.040 に答える
0

正規表現がどのように機能するかはわかりませんが、文字列を正規表現で前処理すると、グローバル検索で機能し、次のように置換される可能性があります。

検索: ,([^,]*(?:,|$))
置換: ' $1' つまり。スペース プラス キャプチャ グループ 1

于 2013-10-02T23:18:16.047 に答える
0

次のように独自のパーサーをロールすることができます。文字列内のコンマを使用して、すべての緯度/経度の値を見つけます。パターンを使用してすべての値を連結します: lat long、lat long、...

declare @list varchar(max) 
declare @result varchar(max)
declare @word varchar(max)
declare @splitOn varchar(1)
declare @wpos int
declare @cpos int
declare @wordCount int

select @list = '148.341158,-21.500773,148.341406,-21.504989,148.375136,-21.513174,148.401674,-21.535247,148.418044,-21.532767,148.408867,-21.511685,148.414075,-21.508461,148.36968,-21.432567,148.349094,-21.438768,148.346862,-21.480187,148.341158,-21.500773,'
select @splitOn = ','
select @result = ''

select @cpos = 0
select @wpos = 1
select @wordCount = 1

while (@cpos <= len(@list))
begin
    select @cpos = charindex(@splitOn, @List, @cpos)
    if (@cpos < 1) select @cpos = len(@list) + 1

    select @word = substring(@list, @wpos, @cpos - @wpos)
    select @result = @result + ' ' + @word

    if ((@wordCount % 2) = 0 and (@cpos < len(@list))) select @result = @result + ','

    select @cpos = @cpos + 1
    select @wpos = @cpos
    select @wordCount = @wordCount + 1
end
select @result as result

次の文字列が生成されます。

148.341158 -21.500773, 148.341406 -21.504989, 148.375136 -21.513174, 148.401674 -21.535247, 148.418044 -21.532767, 148.408867 -21.511685, 148.414075 -21.508461, 148.36968 -21.432567, 148.349094 -21.438768, 148.346862 -21.480187, 148.341158 -21.500773

于 2013-10-03T00:00:16.343 に答える
0

コードをありがとう:-)

少し異なるシナリオがありましたが、「chue x」コードを使用して関数を作成し、3番目の「;」ごとに文字「#」を追加しました。

/*** My select query ***/
SELECT        dbo.fn_AddEveryNthItem(a.MyString, ';','#', 3) AS Expr1
FROM            dbo.MyTable as a

機能は以下

/*** Function to add character for every nth item ***/
Create function dbo.fn_AddEveryNthItem(@list varchar(1000), @splitOn varchar(1), @addChar varchar(1), @EveryNthItem int) 
RETURNS VARCHAR(1000)
AS
BEGIN
declare @word varchar(max)
declare @result varchar(max) = ''
declare @wpos int = 1
declare @cpos int = 0
declare @wordCount int =1

while (@cpos <= len(@list))
begin
    select @cpos = charindex(@splitOn, @List, @cpos)
    if (@cpos < 1) select @cpos = len(@list) + 1

    select @word = substring(@list, @wpos, @cpos - @wpos)
    select @result = @result + @splitOn + @word

    if ((@wordCount % @EveryNthItem) = 0 and (@cpos < len(@list))) select @result = @result + @addChar

    select @cpos = @cpos + 1
    select @wpos = @cpos
    select @wordCount = @wordCount + 1
end
Return @result
end
于 2015-04-08T06:07:37.637 に答える