2017-02-07 54 views
0

基本的に私はGPS座標(緯度と経度)のバッチを持っていますが、 "lat; long"という形式の文字列が必要でした。私がしたことは:Bigquery - 浮動小数点型を浮動小数点型にキャストする方法

CONCAT(CAST(Latitude AS STRING),";", CAST(Longitude AS STRING)) 

しかし、CAST(STRING()は同じことをしました)によって座標が切り上げられた問題に遭遇しました。例えば、select CAST(45.3618927 as STRING)によって私は45.3619を得るでしょう。この丸めを防ぐにはどうしたらいいですか?

注:私は標準SQLのSAFE_CASTが私に何を望んでいるのか知っていますが、他の理由から私はレガシー方言にとどまらなければなりません。

+0

が正確例は、標準SQLで完全に動作すること(これについてコメントするためにエリオットのおかげで)生活はるかに容易になります!どんな丸めもありません。レガシーSQLを正確に保つには? –

答えて

2
#legacySQL 
SELECT CONCAT(
    RTRIM(CONCAT(LEFT(lat_temp, lat_pos - 1), '.', SUBSTR(lat_temp, lat_pos)), '0'), 
    ';', 
    RTRIM(CONCAT(LEFT(lon_temp, lon_pos - 1), '.', SUBSTR(lon_temp, lon_pos)), '0') 
) AS lat_lon 
FROM (
    SELECT 
    INSTR(STRING(lat * 1000000), '.') - 6 AS lat_pos, 
    REPLACE(STRING(lat * 1000000),'.', '') AS lat_temp, 
    INSTR(STRING(lon * 1000000), '.') - 6 AS lon_pos, 
    REPLACE(STRING(lon * 1000000),'.', '') AS lon_temp 
    FROM 
    (SELECT 34.052235 AS lat, -118.243683 AS lon) AS yourTable 
) 

確かに醜いに見えますが、あなたが言ったように - あなたはレガシーSQL
wirg固執したい何らかの理由でそれ以外の場合は、標準SQLのバージョン

#standardSQL 
WITH yourTable AS (
    SELECT 34.052235 AS lat, -118.243683 AS lon 
) 
SELECT CONCAT(CAST(lat AS STRING),";", CAST(lon AS STRING)) AS lat_lon 
FROM yourTable 

別(以下醜い)バージョンについては、以下をご覧くださいレガシーSQLの場合は、JS UDF

#legacySQL 
SELECT lat, lon, lat_lon 
FROM (JS(
    -- input table 
    (
    SELECT lat, lon FROM 
    (SELECT 34.052235 AS lat, -118.243683 AS lon) AS yourTable 
), 
    -- input vars 
    lat, lon, 
    -- output schema 
    "[ 
    {name: 'lat_lon', type: 'STRING'}, 
    {name: 'lat', type: 'FLOAT'}, 
    {name: 'lon', type: 'FLOAT'} 
    ]", 
    -- the function 
    "function(row, emit) { 
    emit({ 
     lat_lon: row.lat.toString().concat(';').concat(row.lon.toString()), 
     lat: row.lat, 
     lon: row.lon 
    }) 
    }" 
)) 

を使用しています。最後に、偶然場合 - あなたはStandard SQLに移行することを決定し、FORMATの使用は

#standardSQL 
SELECT FORMAT('%t;%t', lat, lon) AS lat_lon 
FROM 
    (SELECT 34.052235 AS lat, -118.243683 AS lon) AS yourTable 
+1

'CAST'を全く必要としない別のオプションは、' FORMAT'を使うことです。たとえば、 'SELECT FORMAT( '%t;%t'、lat、lon)AS lat_lon FROM yourTable; ' –

+0

OPはレガシーSQLバージョンを望んでいました。私は意図的に標準SQLの代替として独自の例を使用しました。標準のSQLを実際に使用する場合は、 'FORMAT'を使用する方がはるかにセクシーです:o) –

+0

@MikhailBerlyant @。@答えを読んで、私はほとんど標準の方言に移動するのをもっとやりたいと感じています...理由STRING_AGG()がORDER BYで動作するかどうかわからなかったということでした。 Mosha Pasumanskyが答えを出したhttp://stackoverflow.com/questions/31368235/bigquery-group-concat-and-order-byを参照してください。私は今行って、私の場合のためにこれらを試してみましょう。皆さんありがとう! – foxwendy

関連する問題