我有一个表(Person),其列上传包含上传文档,其中包含.docx,.doc等扩展名。但是有些用户输入了test.test.doc,test.test.test等文档.docx,表示同名的多个句点。我想将多个句点替换为_(test_test.doc,test_test_test.docx)。是否可以通过SQL?任何帮助表示赞赏!!!
答案 0 :(得分: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及其现场演示。
答案 1 :(得分:0)
我认为这会更短,但事实证明它的长度差不多。尽管如此,这是另一种方式:
IsNull(Stuff(
Replace(DocName, '.', '_'),
Len(DocName) - CharIndex('.', Reverse(DocName)) + 1,
1,
'.'
), DocName)
答案 2 :(得分: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