2015-03-24 2 views
-1

У меня есть база данных файлов, включая идентификатор файла, размер, местоположение ect ... Размер файла находится в байтах. Я хотел бы преобразовать его в дружественный размер одновременно с тем, что я выбираю информацию из базы данных. Я использую динамический sql. Это что-то вроде этого возможно (я знаю, что это плохо SQL и не будет даже близко к работе, я просто пытаюсь показать, что я хотел бы случиться):Выполнение логики в операторе select

declare @num bigint; 
select @sql = @sql + 'select Id as ID, Name, Path, '@num = 'filesize, UserName from Files ' 
while (@num >= 1024) 
begin 
    @num = @num/1024 
end 

Любые мысли будут оценены. Я знаю, что могу просто сделать это в коде, а не в SQL, но я обеспокоен тем, что он может быть слишком медленным.

+0

Вы можете создать функцию для вычисления файла размер. –

+0

@PatrickHofman вы можете представить небольшой пример, чтобы я понял, что вы имеете в виду? – user2884789

ответ

1

Это звучит, как вы хотите CASE:

select 
    Id as ID, 
    Name, 
    Path, 
    CASE 
    WHEN filesize >= 1024*1024*1024 
     THEN filesize/(1024*1024*1024) + " GB" 
    WHEN filesize >= 1024*1024 
     THEN filesize/(1024*1024) + " MB" 
    WHEN filesize >= 1024 
     THEN filesize/(1024) + " KB" 
    ELSE filesize 
    END 
    AS filesize, 
    UserName 

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

+0

Я бы посоветовал OP использовать вычисляемый столбец для этого преобразования. Я также удивлен, что этот ответ был принят как есть, потому что он должен генерировать ошибку преобразования типа. Вам нужно преобразовать числовые значения в строку, поэтому '+' интерпретируется как конкатенация. –

0

Вы можете обернуть его в функции:

CREATE FUNCTION GetUserFriendlySize (@i bigint) 
returns varchar(100) 
as 
begin 
    declare @output varchar(100); 

    if @i >= 1024*1024*1024 
    begin 
     set @output = convert(varchar, @i/(1024*1024*1024)) + ' GB' 
    end 
    else if @i >= 1024*1024 
    begin 
     set @output = convert(varchar, @i/(1024*1024)) + ' MB' 
    end 
    else if @i >= 1024 
    begin 
     set @output = convert(varchar, @i/(1024)) + ' KB' 
    end 
    else 
    begin 
     set @output = convert(varchar, @i) + ' B' 
    end 
    return @output 
end 
GO 

Тогда называем это так:

select dbo.GetUserFriendlySize(1999) 

(фактическая логика от D Stanley)

Смежные вопросы