在SQL

时间:2016-09-06 06:47:00

标签: sql sql-server tsql

我正在开发一个C#中的订单管理Web项目,可以提供给多个客户端。

在'命令'表,我有一个字段'数量' 4位小数。  现在并非所有客户都需要4个小数位,所以我有 一张桌子' Config'它将此值保存在字段' QtyDecimal'。

目前我正在做的显示正确的小数位数是这样的:

string xQtyDec = getQtyDecimalFromConfig();
sqlCommand = "Select CAST(Qty as numeric(18," + xQtyDec + ")) [Quantity] from orders";
...

我想知道这是否可以在SQL本身完成,比如

SELECT CAST(Qty as numeric(18, (SELECT QtyDecimal FROM config))) [Quantity] from orders

这可能吗?

4 个答案:

答案 0 :(得分:1)

根据Sql服务器语法,请参阅https://msdn.microsoft.com/en-us/library/ms174979.aspx数据类型参数(精度和小数位数)必须是文字。他们不能成为表达。 在客户端,你最好做那样的事情。或者使用round(),将结果转换为最大可能的比例(4)并从字符串表示中删除额外的零

declare @s int = 2; -- scale config parameter, = 0..4

select t.col, substring(calc.v, 1, len(calc.v) -(4-@s))
from (--- sample data
      values (12345.06789) 
        , (8765000.1)
     ) t(col)
cross apply (
    select v = cast(cast(round(col, @s) as numeric (18,4)) as varchar(20))
    ) calc  

答案 1 :(得分:1)

在SQL Server中,您需要构建动态查询以实现结果。

DECLARE @Scale NVARCHAR(50)
SELECT  @scale= QtyDecimal FROM config
DECLARE @sql NVARCHAR(500)='SELECT CAST(Qty as numeric(18, ' +@scale+')) [Quantity] from orders'
EXEC (@sql)

答案 2 :(得分:0)

是的,这是可能的,但您应该将查询重写为:

SELECT CAST(orders.Qty as numeric(18, (config.QtyDecimal))) AS [Quantity] from orders, config
WHERE {some selection on config table to get the correct QtyDecimal}

答案 3 :(得分:0)

最好的选择不是这样做,而是在转换数据集进行显示或下载时在C#中执行此操作。但是,如果您需要在SQL中执行此操作,则可以使用以下方法之一。

方法1:

Select CAST(CASE (select xQtyDecimal from Config)
   WHEN 1 then CAST(FieldName as NUMERIC(10,1)
   WHEN 2 then CAST(FieldName as NUMERIC(10,2)
   WHEN 3 then CAST(FieldName as NUMERIC(10,3)
   WHEN 4 then CAST(FieldName as NUMERIC(10,4)
   WHEN 5 then CAST(FieldName as NUMERIC(10,5)
   ELSE FieldName END AS NUMERIC(10,6)) As FieldNameAlias
From TableName
  • Pro:完全控制每种情况下的行为
  • Con:每个案件都必须写出来。

方法2:

SELECT CAST(CAST(FieldName * POWER(10, (select xQtyDec from config)) as BIGINT) AS NUMERIC(20,10))/POWER(10, (select xQtyDec from config))
FROM TableName
  • Pro:可以使用
  • 处理任意数量的小数位数
  • Con:向下,无法控制,例如银行家的四舍五入。