需要用连字符替换一些下划线

时间:2014-02-21 20:02:59

标签: sql sql-server sql-server-2008 tsql

我有一个值为

的列

AAA_ZZZZ_7890_10_28_2014_123456.jpg

我需要更换中间下划线,以便将其显示为日期,即

AAA_ZZZZ_7890_10-28-2014_123456.jpg

有人可以为此建议一个简单的更新查询。

下划线的数量对于列中的所有值都是相同的,但长度会有所不同,例如有些可以有

AAA_q10WRQ_001_10_28_2014_12.jpg

3 个答案:

答案 0 :(得分:0)

试试这个(假设DATE部分始终以相同的字符索引开始)

declare @string varchar(64) = 'AAA_ZZZZ_7890_10_28_2014_123456.jpg'
select replace(@string, reverse(substring(reverse(@string), charindex('_', reverse(@string), 0) + 1, 10)), replace(reverse(substring(reverse(@string), charindex('_', reverse(@string), 0) + 1, 10)), '_', '-'))

答案 1 :(得分:0)

如果第一个

正好有6 _那么

选择STUFF('AAA_ZZZZ_7890_10_28_2014_123456.jpg',CHARINDEX('_','AAA_ZZZZ_7890_10_28_2014_123456.jpg',CHARINDEX('_','AAA_ZZZZ_7890_10_28_2014_123456.jpg',CHARINDEX('_','AAA_ZZZZ_7890_10_28_2014_123456.jpg',CHARINDEX( '_','AAA_ZZZZ_7890_10_28_2014_123456.jpg',0)+ 1)+ 1)+ 1),1,' - ')

答案 2 :(得分:0)

以下应该这样做:

http://sqlfiddle.com/#!3/d41d8/30384/0

declare @filename varchar(64) = 'AAA_ZZZZ_7890_10_28_2014_123456.jpg'
declare @datepattern varchar(64) = '%[_][0-1][0-9][_][0-3][0-9][_][1-2][0-9][0-9][0-9][_]%'

select
  filename,
  substring(filename,1,datepos+2)+'-'+
  substring(filename,datepos+4,2)+'-'+
  substring(filename,datepos+7,1000)
from
(
  select
    @filename filename,
    patindex(@datepattern,@filename)
      as datepos
) t
;

导致

AAA_ZZZZ_7890_10-28-2014_123456.jpg

需要注意的注意事项:

  • 完全定义如何查找日期非常重要。在我的定义中,MM_DD_YYYY被另外两个下划线包围,我检查M,D,Y的第一个数字分别是0-1,0-3,1-2(即我不检查月份是否为例如13。 ) - 当然我们假设任何文件名中只有一个这样的字符串。
  • datepos实际上会在日期之前找到下划线的位置 - 如果在substring的索引中考虑到这一点,则不会出现问题。
  • 在第3个子字符串中,长度不能是NULL或无穷大,我无法让LEN()在SQL Fiddle中工作,所以我硬编码了足够大的数字(1000)。对此的更正是受欢迎的。