SQL中的拆分和连接函数

时间:2018-04-23 13:00:30

标签: sql oracle substring

我正在处理包含以下行的数据:

Address
--------
AB.CB.2k.SSS.45a
XY.ZZ.3m.WWW.67n
FD.KL.7b.TTT.82l

如何编写SQL查询,只是为了获取每行的前3个部分。

例如:AB.CB.2k.SSS.45a应为AB.CB.2k

5 个答案:

答案 0 :(得分:3)

您可以将字符串函数substrinstr结合起来找出第3次出现.并获取所需的子字符串部分。

select substr(Address, 0, instr(Address, '.', 1, 3) - 1)
from your_table;

答案 1 :(得分:2)

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE addresses ( Address ) AS
  SELECT 'AB.CB.2k.SSS.45a' FROM DUAL UNION ALL
  SELECT 'XY.ZZ.3m.WWW.67n' FROM DUAL UNION ALL
  SELECT 'FD.KL.7b.TTT.82l' FROM DUAL UNION ALL
  SELECT 'PQ.RS.TU' FROM DUAL UNION ALL
  SELECT 'MN.OP' FROM DUAL;

查询1

如果您想在地址中少于3个NULL字符时使用.值,则可以使用:

SELECT SUBSTR(
         address,
         1,
         INSTR( address, '.', 1, 3 ) - 1
       ) AS address_part
FROM   addresses

<强> Results

| ADDRESS_PART |
|--------------|
|     AB.CB.2k |
|     XY.ZZ.3m |
|     FD.KL.7b |
|       (null) |
|       (null) |

查询2

如果要在少于3个.字符时返回完整字符串,则:

SELECT SUBSTR(
         address,
         1,
         CASE pos WHEN 0 THEN LENGTH( address ) ELSE pos - 1 END
       ) AS address_part
FROM   (
  SELECT address,
         INSTR( address, '.', 1, 3 ) AS pos
  FROM   addresses
)

<强> Results

| ADDRESS_PART |
|--------------|
|     AB.CB.2k |
|     XY.ZZ.3m |
|     FD.KL.7b |
|     PQ.RS.TU |
|        MN.OP |

答案 2 :(得分:1)

您可以尝试以下查询获取相同的

select substr(adress,1,instr(address,'.',1,3)-1) from table

答案 3 :(得分:1)

SELECT COALESCE(SUBSTR("Address",1,INSTR("Address",'.',1,3)-1),"Address") AS "Address"
FROM Table1 t

<强>输出

Address
AB.CB.2k
XY.ZZ.3m
FD.KL.7b

<强>演示

  

http://sqlfiddle.com/#!4/3e05f/2

<强>说明

INSTR功能

  

Oracle / PLSQL INSTR函数返回字符串中子字符串的位置。

<强>语法

INSTR( string, substring [, start_position [, th_appearance ] ] )

SUBSTR功能

  

SUBSTR函数用于从大字符串中提取子字符串。

<强>语法:

SUBSTR(String, Start pos, End pos)

COALESCE功能

  

COALESCE函数返回列表中的第一个非null表达式。   如果所有表达式求值为null,则COALESCE函数将为   return null。

<强>语法

COALESCE( expr1, expr2, ... expr_n )

答案 4 :(得分:1)

加入:

substr(address,1, instr(address||'.', '.', 1, 3) -1 )

rtrim(regexp_substr(address||'.','([^.]+[.]){3}'),'.')