我正在处理包含以下行的数据:
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
答案 0 :(得分:3)
您可以将字符串函数substr
和instr
结合起来找出第3次出现.
并获取所需的子字符串部分。
select substr(Address, 0, instr(Address, '.', 1, 3) - 1)
from your_table;
答案 1 :(得分:2)
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
<强>演示强>
<强>说明强>
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}'),'.')