繁体   English   中英

Oracle 18c XE-如何将字符串拆分为数字

[英]Oracle 18c XE- How to split string into numbers

我正在尝试将字符串拆分为数字。 字符串看起来像这样:

POINT(-122.419956922531 37.7647100858191)

我想删除“点”和“括号”,只得到数字。 我试过这个(下面的代码)。 尽管它在表中看起来不错,但我一直未能将结果转换为数字:

select 
   REGEXP_SUBSTR(geom_, '(\S*)' ) as longi,
    REGEXP_SUBSTR(geom_, '(\S*)[^()]',1,2) as atti    
from 
   (select 
      a.*,
      REGEXP_SUBSTR('POINT(-122.419956922531 37.7647100858191)', '\d.+') as geom_ from dual a);

关于如何从POINT(-122.419956922531 37.7647100858191)提取数字的任何提示?

SELECT REGEXP_SUBSTR(
         geom_,
         'POINT\(([+-]?\d+(\.\d+)?) ([+-]?\d+(\.\d+)?)\)',
         1,
         1,
         NULL,
         1
       ) AS longitude,
       REGEXP_SUBSTR(
         geom_,
         'POINT\(([+-]?\d+(\.\d+)?) ([+-]?\d+(\.\d+)?)\)',
         1,
         1,
         NULL,
         3
       ) AS latitude
FROM   your_table;

或者:

SELECT REGEXP_SUBSTR( geom_, '[+-]?\d+(\.\d+)?', 1, 1 ) AS longitude,
       REGEXP_SUBSTR( geom_, '[+-]?\d+(\.\d+)?', 1, 2 ) AS latitude
FROM   your_table;

或使用简单的字符串函数:

SELECT SUBSTR( geom_, 7, INSTR( geom_, ' ' ) - 7 )
         AS longitude,
       SUBSTR( geom_, INSTR( geom_, ' ' ) + 1, LENGTH( geom_ ) - INSTR( geom_, ' ' ) - 1 )
         AS latitide
FROM   your_table

其中,对于样本数据:

CREATE TABLE your_table ( geom_ ) AS
SELECT 'POINT(-122.419956922531 37.7647100858191)' FROM DUAL;

他们都输出:

\n经度 | 纬度        \n :---------------- |  :--------------\n -122.419956922531 |  37.7647100858191\n

(注意:如果您想要一个数字而不是包含数值的字符串,请将输出包装在TO_NUMBER 。)

db<> 在这里摆弄


更新:

如果您的小数点分隔符通常是,那么您可以使用TO_NUMBER并明确指定一个. 使用TO_NUMBER时,小数点分隔符作为第三个参数:

SELECT TO_NUMBER(
         REGEXP_SUBSTR( geom_, '[+-]?\d+(\.\d+)?', 1, 1 ),
         '999D9999999999999',
         'NLS_NUMERIC_CHARACTERS=''.,'''
       ) AS longitude,
       TO_NUMBER(
         REGEXP_SUBSTR( geom_, '[+-]?\d+(\.\d+)?', 1, 2 ),
         '999D9999999999999',
         'NLS_NUMERIC_CHARACTERS=''.,'''
       ) AS latitude
FROM ( select 'POINT(-122.419956922531 37.7647100858191)' as geom_ from dual );

db<> 在这里摆弄

这是一个简单的方法:

WITH cteString
       AS (SELECT 'POINT(-122.419956922531 37.7647100858191)' AS POINT_STRING FROM DUAL)
SELECT TO_NUMBER(REGEXP_SUBSTR(POINT_STRING, '[+-]?[0-9.]+', 1, 1)) AS LATITUDE,
       TO_NUMBER(REGEXP_SUBSTR(POINT_STRING, '[+-]?[0-9.]+', 1, 2)) AS LONGITUDE
  FROM cteString

正则表达式[+-]?[0-9.]+接受由一位或多位数字 0-9 和小数点组成的子字符串,可选地以符号字符开头。 它查找第一个这样的子字符串,将结果子字符串转换为 NUMBER,并将其作为名为 LATITUDE 的字段放入结果集中。 然后查找第二个这样的子字符串,将其转换为 NUMBER,并调用 LONGITUDE。

db<>在这里摆弄

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM