2013-06-11 65 views
1

我有一个表(Person),它有一个列上载包含上载的文档,它们具有诸如.docx,.doc等扩展名。但是一些用户输入文档,如test.test .doc,test.test.test.docx,表示同一名称中的多个句点。我想将这多个句点替换为_(test_test.doc,test_test_test.docx)。是否可以通过SQL?任何帮助表示赞赏!从sql中的名称中删除多个句点

+1

难道有什么错在文件名中有时间? – Blorgbeard

+0

是的我有一个应用程序处理相同,并得到崩溃。作为解决方法,我们需要将其应用于已输入的值,并且还需要进行验证以防止文件名中出现多个句点。 – user2395176

+0

您无法修复该应用程序?好。 – Blorgbeard

回答

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 ║ 
╚═════════════════════╝ 

而且here is a sqlfiddle与它的现场演示。

+0

+1击败我吧 – Blorgbeard

+0

尽管你不需要charindex中的',0',那是默认值。 – Blorgbeard

+0

@Blorgbeard是的,即使这是默认值,仍然会在'CHARINDEX'上放置',0'。 – Lamak

0

我认为这会更短,但它原来是相同的长度。尽管如此,这里是另一种方式:

IsNull(Stuff(
    Replace(DocName, '.', '_'), 
    Len(DocName) - CharIndex('.', Reverse(DocName)) + 1, 
    1, 
    '.' 
), DocName) 
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