Есть ли способ в SQL изменить значения в столбце географии с инвертированными значениями широты и долготы?

В столбце таблицы, где хранятся данные географического типа, данные вводятся в формате (Широта, Долгота) вместо (Долгота, Широта). Можно ли как-то легко это исправить?

Исправить процесс, который отправляет его в неправильном формате? Без кода, что вы на самом деле ожидаете здесь?

Thom A 11.12.2020 15:03

Какой тип столбца?

JeffUK 11.12.2020 15:03

Основываясь на вопросе, я бы предположил, что это geography @JeffUK.

Thom A 11.12.2020 15:04

@Larnu Я тоже так думаю, но «данные типа географии» неоднозначны! в любом случае, я думаю, что короткий ответ - преобразовать его в текст, если он уже не текст, выполнить некоторые манипуляции со строками, чтобы поменять местами части, преобразовать его обратно в географию.

JeffUK 11.12.2020 15:07

Да, я исправил это. Но сейчас в таблице двадцать тысяч данных. Я хочу исправить это. @Ларну

Batuhan Karaman 11.12.2020 15:08

Как это неоднозначно, @JeffUK, когда есть тип данных geography? Это все равно, что сказать «у меня есть столбец int» неоднозначно.

Thom A 11.12.2020 15:08

Я настоятельно рекомендую вам НЕ исправлять процесс, пока вы не исправите данные, иначе все очень быстро станет очень запутанным! @larnu - Потому что английский - см. «Географический тип» и «Географический тип»

JeffUK 11.12.2020 15:08

Спасибо, я думал может есть более простой способ. Так что я попробую это. @JeffUK

Batuhan Karaman 11.12.2020 15:09

Боюсь, как англичанин, я до сих пор не вижу двусмысленности, @JeffUK, но мы здесь отклоняемся от темы.

Thom A 11.12.2020 15:12
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
9
114
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

..максимум 10 баллов за экземпляр geography...

declare @t table (_geography geography);

insert into @t(_geography)
values
(geography::STMPolyFromText('MULTIPOLYGON(((-72.358 47.653, -72.348 47.649, -72.358 47.658, -72.358 47.653)), ((-72.341 47.656, -72.341 47.661, -72.351 47.661, -72.341 47.656)))', 4326)),
(geography::STMPolyFromText('MULTIPOLYGON(((-72.358 47.653, -72.348 47.649, -72.358 47.658, -72.358 47.653)))', 4326)),
(geography::STGeomFromText('LINESTRING(-40.360 47.656, -45.343 47.656, -46.355 44.680, -44.355 42.680 )', 4326)),
(geography::STGeomFromText('MULTIPOINT(-50.360 47.656, -50.343 47.656)', 4326)),
(geography::STGeomFromText('CIRCULARSTRING(-72.358 47.653, -72.348 47.649, -72.348 47.658, -72.358 47.658, -72.358 47.653)', 4326))  
;  

select 
    _geography.STIsValid() as oldgeographyValid,
    _geography.ToString() as oldgeographyToString,
    newgeographystring as newgeographyToString
    --geography::STGeomFromText(newgeographystring, _geography.STSrid).STIsValid()  as newgeography
from
(
select t.*, 

    formatmessage(
    --old points become placeholders
    replace(replace(replace(replace(replace( --max:10points, 10 replaces
    replace(replace(replace(replace(replace(t._geography.ToString(), 
    isnull(p.xp.value('(p[@r=1]/@o)[1]', 'varchar(100)'), ''), '%s'), --1st replace
    isnull(p.xp.value('(p[@r=2]/@o)[1]', 'varchar(100)'), ''), '%s'),
    isnull(p.xp.value('(p[@r=3]/@o)[1]', 'varchar(100)'), ''), '%s'),
    isnull(p.xp.value('(p[@r=4]/@o)[1]', 'varchar(100)'), ''), '%s'),
    isnull(p.xp.value('(p[@r=5]/@o)[1]', 'varchar(100)'), ''), '%s'), --5th replace
    isnull(p.xp.value('(p[@r=6]/@o)[1]', 'varchar(100)'), ''), '%s'),
    isnull(p.xp.value('(p[@r=7]/@o)[1]', 'varchar(100)'), ''), '%s'),
    isnull(p.xp.value('(p[@r=8]/@o)[1]', 'varchar(100)'), ''), '%s'),
    isnull(p.xp.value('(p[@r=9]/@o)[1]', 'varchar(100)'), ''), '%s'),
    isnull(p.xp.value('(p[@r=10]/@o)[1]', 'varchar(100)'), ''), '%s'), --10th replace

    --format message parameters := new points
    p.xp.value('(p[@r=1]/@n)[1]', 'varchar(100)'),
    p.xp.value('(p[@r=2]/@n)[1]', 'varchar(100)'),
    p.xp.value('(p[@r=3]/@n)[1]', 'varchar(100)'),
    p.xp.value('(p[@r=4]/@n)[1]', 'varchar(100)'),
    p.xp.value('(p[@r=5]/@n)[1]', 'varchar(100)'),
    p.xp.value('(p[@r=6]/@n)[1]', 'varchar(100)'),
    p.xp.value('(p[@r=7]/@n)[1]', 'varchar(100)'),
    p.xp.value('(p[@r=8]/@n)[1]', 'varchar(100)'),
    p.xp.value('(p[@r=9]/@n)[1]', 'varchar(100)'),
    p.xp.value('(p[@r=10]/@n)[1]', 'varchar(100)')
    ) --formatmessage end
    as newgeographystring
from @t as t
cross apply
(
    select
    (
    select 
        rownum as '@r',
        concat(t._geography.STPointN(n.rownum).Long, ' ', t._geography.STPointN(n.rownum).Lat) as '@o', --old point
        concat(t._geography.STPointN(n.rownum).Lat, ' ', t._geography.STPointN(n.rownum).Long) as '@n' --new point
    from
    (
        select top (t._geography.STNumPoints()) row_number() over(order by @@spid) as rownum
        from sys.all_objects
    ) as n
    order by rownum
    for xml path('p'), type
    ) as xp
) as p
) as src;

Другие вопросы по теме