如何根据分隔符拆分字符串?

时间:2016-07-11 11:32:14

标签: sql db2 substring

我有一列可变长度的字符串,其中一些以.

结尾

EU...
EU
EU.
EEU.
EEU...

我想要选择不存在.的整个字符串,或者选择第一个.之前的字符串,以便我得到:

EU
EU
EU
EEU
EEU

我知道substr()功能但需要固定位置作为参数。如你所见,这是不可能的。我可以将正则表达式插入SQL DB2语句吗?

4 个答案:

答案 0 :(得分:3)

你也可以试试这个:

db2 "SELECT * from test"

TEST

  

... EU
  欧盟
  欧盟。
  EEU。
  EEU ...

<强> 5 record(s) selected.

db2 "SELECT Replace(test, '.', '') as test from test"

1

  

EU
  欧盟
  欧盟
  EEU
  EEU

<强> 5 record(s) selected.

答案 1 :(得分:0)

@ Mahedi的回答让我走上了正确的道路。我无法使用CHARINDEX(),但可以使用locate()

使用此回答https://stackoverflow.com/a/19007026/1268941

可以使用substr()和locate()的组合:

substr(column_name,1,locate('.',column_name))

但是因为这样可以保留我可以使用的尾随.

substr(column_name,1,locate('.',column_name)-1)

但是这会导致“内置字符串函数的数字参数超出范围”,因为在某些情况下,locate返回-1,其中substr()显然不接受作为位置参数

使用case语句,您只能在包含.

的单元格上运行上述逻辑
select case when locate('.',column_name) > 0 then 
substr(column_name,1,locate('.',column_name)-1) else
column_name end as newcol from mytable;

您也可以使用LEFT

稍微减少这一点
select case when locate('-',column_name) > 0 then 
    left(column_name,locate('.',column_name)-1) else
    column_name end as newcol from mytable;

答案 2 :(得分:0)

SELECT translate(test, '.', ' ') as test from test

答案 3 :(得分:0)

虽然我承认所有期间的隐含替换或仅从OP中的文本返回该期间之前的字符数据,但似乎可以从提供的测试数据中获得,以下任何一项可能都是效果所需的全部内容。只是修剪尾随时期;每个效果将匹配显示为预期输出:
TRIM( TRAILING '.' FROM The_Column )

STRIP( The_Column, TRAILING, '.' )
FWiW:虽然示例数据不包括字符串中较早出现句号的任何值,但也没有明确提及总是没有,这反映在样本数据中。如果是这样,那么上述修剪标量可能没有帮助;但是以下设置包括一些在字符串结尾之前有句点的值,至少要考虑所需的效果:

create table       eudata (eu_column varchar(12) )
;
insert into  qtemp.eudata values
   ( 'EU...'   )               
,  ( 'EU'      )               
,  ( 'EU.'     )               
,  ( 'EEU.'    )               
,  ( 'EEU...'  )               
,  ( 'EU.S.A..')               
,  ( '.EUROPE' )               
,  ( '.EURO..' )               
;
select eu_column                                      
     , TRIM( TRAILING '.' FROM  eu_Column ) as trim_t 
     , STRIP(  eu_Column, TRAILING, '.' )   as strip_t
from eudata 
; -- report from above query follows:
EU_COLUMN     TRIM_T        STRIP_T
EU...         EU            EU     
EU            EU            EU     
EU.           EU            EU     
EEU.          EEU           EEU    
EEU...        EEU           EEU    
EU.S.A..      EU.S.A        EU.S.A 
.EUROPE       .EUROPE       .EUROPE
.EURO..       .EURO         .EURO  
-- End of data --