简体   繁体   English

使用switch-case语句进行T-SQL更新

[英]T-SQL update with switch-case statement

I want implement this pseudocode in t-sql 我想在t-sql中实现这个伪代码

UPDATE Resources SET [Path]= CASE ([Path].Substring([Path].LastIndexOf('.')))
                            WHEN '.jpg' THEN '/image.jpg'
                            WHEN '.png' THEN '/image.jpg'
                            WHEN '.avi' THEN '/video.jpg' 
                            WHEN '.mkv' THEN '/video.jpg'

for it I use this solution 为此,我使用这个解决方案

UPDATE Resources SET [Path] = CASE (SUBSTRING([Path], LEN([Path]) - CHARINDEX('.', REVERSE([Path])) + 1, 3))                
                                        WHEN '.jpg' THEN '/image.jpg'
                                        WHEN '.png' THEN '/image.jpg'
                                        WHEN '.avi' THEN '/video.jpg' 
                                        WHEN '.mkv' THEN '/video.jpg'
                                     END

but it is does not return expected result. 但它不会返回预期的结果。

Can anyone give me working version please? 有人能给我工作版吗?

UPDATE 
  Resources 
SET
  Path = CASE SUBSTRING(Path, LEN(Path) - CHARINDEX('.', REVERSE(Path)) + 1, 4)
           WHEN '.jpg' THEN '/image.jpg'
           WHEN '.png' THEN '/image.jpg'
           WHEN '.avi' THEN '/video.jpg' 
           WHEN '.mkv' THEN '/video.jpg'
         END

而不是SUBSTRING([Path], LEN([Path]) - CHARINDEX('.', REVERSE([Path])) + 1, 3) ,尝试使用lower(right([Path], 4))

Your read of the extension is wrong, instead try: 您阅读的扩展程序是错误的,而是尝试:

SUBSTRING(Path, LEN(Path) - CHARINDEX('.', REVERSE(Path)) + 1, LEN(Path)) 

(Using LEN(Path) as the read length; fine if it overflows the end of the string and allows for n-character extensions) (使用LEN(Path)作为读取长度;如果它溢出字符串的末尾并允许n个字符扩展,则很好)

Try using the ParseName 尝试使用ParseName

UPDATE Resources SET [Path] = CASE (Parsename(Path,1))                
                                        WHEN 'jpg' THEN '/image.jpg'
                                        WHEN 'png' THEN '/image.jpg'
                                        WHEN 'avi' THEN '/video.jpg' 
                                        WHEN 'mkv' THEN '/video.jpg'
                                     END
UPDATE Resources SET ThumbnailPath = CASE SUBSTRING(ThumbnailPath, LEN(ThumbnailPath) - CHARINDEX('.', REVERSE(ThumbnailPath)) + 1, LEN(ThumbnailPath))             
                    WHEN '.doc'   THEN @root + '/doc.png'
                    WHEN '.docx'  THEN @root + '/doc.png'
                    WHEN '.jpg'   THEN @root + '/image.png'
                    WHEN '.jpeg'  THEN @root + '/image.png'
                    WHEN '.gif'   THEN @root + '/image.png'
                    WHEN '.png'   THEN @root + '/image.png'
                    WHEN '.ppt'   THEN @root + '/ppt.png'
                    WHEN '.pptx'  THEN @root + '/ppt.png'
                    WHEN '.pdf'   THEN @root + '/pdf.png'
                    ELSE               @root + '/other.png'
                 END

thank you I finaly use this 谢谢我最终使用它

This script will assure that you do not update all rows every time you run the script. 此脚本将确保您每次运行脚本时都不会更新所有行。 It will only update changes. 它只会更新更改。

UPDATE r
SET ThumbnailPath = newvalue
FROM Resources r
cross apply 
(SELECT right(ThumbnailPath, patindex('%_.%', reverse(ThumbnailPath))) T) a                 
cross apply 
(SELECT CASE 
                    WHEN a.T in ('doc','docx' )            THEN @root + '/doc.png' 
                    WHEN a.T in ('jpg','jpeg','gif','png') THEN @root + '/image.png' 
                    WHEN a.T in ('ppt','pptx')             THEN @root + '/ppt.png' 
                    WHEN a.T = 'pdf'                       THEN '/pdf.png'
                    ELSE @root + '/other.png' 
                 END newvalue)  b
WHERE r.ThumbnailPath <> b.newvalue

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM