Обновление T-SQL с оператором switch-case - PullRequest
3 голосов
/ 02 сентября 2011

Я хочу реализовать этот псевдокод в 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'

для этого я использую это решение

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

но это не возвращает ожидаемый результат.

Может кто-нибудь дать мне рабочую версию, пожалуйста?

Ответы [ 6 ]

7 голосов
/ 02 сентября 2011
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
3 голосов
/ 02 сентября 2011

вместо SUBSTRING([Path], LEN([Path]) - CHARINDEX('.', REVERSE([Path])) + 1, 3), попробуйте использовать lower(right([Path], 4))

2 голосов
/ 02 сентября 2011

Попробуйте использовать 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
2 голосов
/ 02 сентября 2011

Вы прочитали расширение неправильно, вместо этого попробуйте:

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

(с использованием LEN(Path) в качестве длины чтения; хорошо, если она переполняет конец строки и допускает n-символьные расширения)

0 голосов
/ 02 сентября 2011

Этот скрипт гарантирует, что вы не будете обновлять все строки при каждом запуске скрипта. Это только обновит изменения.

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
0 голосов
/ 02 сентября 2011
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

спасибо, я наконец использую это

...