我有一个文件数据库,包括文件ID,大小,位置等... filesize以字节为单位。我想在从数据库中选择信息的同时将其转换为友好的大小。我正在使用动态sql。这样的事情是可能的(我知道这是不好的SQL,甚至不会接近工作,我只是想表明我想要发生的事情):
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 :(得分: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的责任。我无法想象在代码中执行此操作会更慢。
答案 1 :(得分: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的实际逻辑)