2017-02-07 19 views
0

基本上我有一批GPS坐标(lat和long),我想要一个格式为“lat; long”的字符串。我所做的是:Bigquery - 如何将float浮动到字符串w/o向上/向下舍入?

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

但遇到了一个问题,坐标由CAST(STRING()做了同样的事情)四舍五入。例如,通过select CAST(45.3618927 as STRING)我会得到45.3619。我怎样才能防止这个四舍五入?

注意:我知道标准SQL中的SAFE_CAST给了我想要的东西,但由于其他原因,我不得不继续使用Legacy方言。

+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 
) 

看起来很丑陋,但正如你所说 - 由于某种原因你要坚持wirg传统的SQL
否则请参阅下面的标准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 

另(较小丑陋的)版本对于Legacy 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一起工作。请参阅http://stackoverflow.com/questions/31368235/bigquery-group-concat-and-order-by其中Mosha Pasumansky提供了答案。我现在就去,为我的情况尝试一下。谢谢大家! – foxwendy