在select语句中执行逻辑

时间:2015-03-24 14:57:04

标签: sql sql-server

我有一个文件数据库,包括文件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中执行此操作,但我担心它可能太慢。

2 个答案:

答案 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的实际逻辑)