1

我有一个表(人),其中有一列 uploads 包含上传的文档,扩展名为 .docx、.doc 等。但是有些用户输入了 test.test.doc、test.test.test.docx 等文档,表示同名的多个句点。我想将多个句点替换为 _(test_test.doc,test_test_test.docx)。可以通过 SQL 实现吗?任何帮助表示赞赏!

4

3 回答 3

4

这是一种(相当复杂的)方法:

DECLARE @DataTable TABLE(Data VARCHAR(100))

INSERT INTO @DataTable 
VALUES  ('test.test.doc'),
        ('test.test.test.docx')

SELECT  REPLACE(LEFT(Data,LEN(Data)-CHARINDEX('.',REVERSE(Data),0)),'.','_')+
        RIGHT(Data,CHARINDEX('.',REVERSE(Data),0)) Col1
FROM @DataTable

这些是结果:

╔═════════════════════╗
║        Col1         ║
╠═════════════════════╣
║ test_test.doc       ║
║ test_test_test.docx ║
╚═════════════════════╝

这是一个带有现场演示的sqlfiddle 。

于 2013-06-11T21:58:36.520 回答
0

我以为这会更短,但结果却是差不多一样长。尽管如此,这里还有另一种方式:

IsNull(Stuff(
   Replace(DocName, '.', '_'),
   Len(DocName) - CharIndex('.', Reverse(DocName)) + 1,
   1,
   '.'
), DocName)
于 2013-06-11T22:15:00.850 回答
0

试试这个——

DECLARE @DataTable TABLE (txt VARCHAR(100))
INSERT INTO @DataTable (txt)
VALUES ('test.test.doc'), ('test.test.test.docx')

SELECT 
      REVERSE(REPLACE(SUBSTRING(txt, CHARINDEX('.', txt, 1) + 1, LEN(txt)), '.', '_')) 
    + REVERSE(LEFT(txt, CHARINDEX('.', txt, 0)))
FROM (
    SELECT txt = REVERSE(txt)
    FROM @DataTable
) t
于 2013-06-12T06:14:58.410 回答