我有一列可变长度的字符串,其中一些以.
即
EU...
EU
EU.
EEU.
EEU...
我想要选择不存在.
的整个字符串,或者选择第一个.
之前的字符串,以便我得到:
EU
EU
EU
EEU
EEU
我知道substr()
功能但需要固定位置作为参数。如你所见,这是不可能的。我可以将正则表达式插入SQL DB2语句吗?
答案 0 :(得分:3)
你也可以试试这个:
db2 "SELECT * from test"
... EU
欧盟
欧盟。
EEU。
EEU ...
<强> 5 record(s) selected.
强>
db2 "SELECT Replace(test, '.', '') as test from test"
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 --