【问题标题】:Split and concat function in SQLSQL中的split和concat函数
【发布时间】:2018-10-03 12:56:29
【问题描述】:

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

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

【问题讨论】:

  • 请提供一些您已经尝试过的代码
  • 前 3 部分是否总是在 "." 前包含 2 个字符?
  • 不同,不一定是两个字符

标签: sql oracle substring


【解决方案1】:

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

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

【讨论】:

  • 如果输入是AB.CD.EF那么这将输出NULL
【解决方案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 |

【讨论】:

    【解决方案3】:

    你可以试试下面的查询得到同样的结果

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

    【讨论】:

    • 如果输入是AB.CD.EF那么这将输出NULL
    【解决方案4】:
    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,则 COALESCE 函数将 返回空值。

    语法

    COALESCE( expr1, expr2, ... expr_n )
    

    【讨论】:

    • 如果输入是AB.CD.EF那么这将输出NULL
    • 编辑了我的答案
    【解决方案5】:

    只是为了加入:

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

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

    【讨论】:

      最近更新 更多