2017-02-09 90 views
1

是否可以显示表值加“ - ”显示列值

例如,我们有列值

201602 
201732 
201853 

期望中的值应该是

2016-02 
2017-32 
2018-53 

in sql

+0

如果数据始终具有可以以相同的格式结合子串和串联。 – jarlh

+0

欢迎来到Stack Overflow。您可以使用[代码示例'{}'](https://i.imgur.com/3ppJhiE.png)工具栏按钮格式化源代码 - 这次我已经为您完成了。 –

+0

这是一个字符串还是数值? – dnoeth

回答

3
select substr(col,1,4)||'-'||substr(col,5) from my_table 
0

如果列t ype是数字,你可以使用MOD操作符。

查询将是:

select int(col/100)||'-'||mod(col,100) from my_table 
+0

“INT”:无效的ID – user1213199

+0

@ user1213199 - 使用'trunc()'而不是'int()'。 mod'd值需要填零,或者第一个值显示为“2016-2” –

0

你也可以使用正则表达式,假设值总是恰好六个数字,用四位数字和两位数字的图案分割值,并使用反向引用以重建它:

with mytable (value) as (
    select 201602 from dual 
    union all select 201732 from dual 
    union all select 201853 from dual 
) 
select value, regexp_replace(value, '(\d{4})(\d{2})', '\1-\2') as new_value 
from mytable; 

    VALUE NEW_VALUE      
---------- ------------------------------ 
    201602 2016-02      
    201732 2017-32      
    201853 2018-53      

虽然使用substr可能会更有效,但有很多数据。你隐式地将数字转换为一个字符串和两个;明确地做它并不是真的必要,但可能需要清楚。

如果您可以有更长的值,这将始终将破折号放在第四个字符后面,因此1234567将显示为1234-567。如果您希望最后两位数始终分开,您可以使用'(\d{4})(\d{2})$'模式,而使用$定位符;并且,以应付更短的值,你可以从第一分组省略尺寸:

with mytable (value) as (
    select 201602 from dual 
    union all select 201732 from dual 
    union all select 201853 from dual 
    union all select 12 from dual 
    union all select 123 from dual 
    union all select 1234 from dual 
    union all select 1234567 from dual 
) 
select value, regexp_replace(value, '(\d+)(\d{2})$', '\1-\2') as new_value 
from mytable; 

    VALUE NEW_VALUE      
---------- ------------------------------ 
    201602 2016-02      
    201732 2017-32      
    201853 2018-53      
     12 12        
     123 1-23       
     1234 12-34       
    1234567 12345-67      
0

使用运营商' || '这CONCAT您的选择;

例如:

SELECT 'TEST' || '-' || 'MY' || '-' || 'QUERY' FROM DUAL;