点后的Sql值更改[重复]

Posted

技术标签:

【中文标题】点后的Sql值更改[重复]【英文标题】:Sql Value change after the dot [duplicate] 【发布时间】:2021-12-15 12:41:25 【问题描述】:

我正在尝试更改点之后的值。自定义舍入。我正在将一个参数传递给函数(应该是真实值,但我可以使用 varchar 吗?) 在此示例中,我尝试使用带有子字符串的 varchar,但这会导致转换错误。 有人能告诉我我可以用什么方法来达到我的结果吗?也许是真正的数据类型值?但是我可以使用子字符串吗?

CREATE FUNCTION dbo.Myfunction
(
    @Liczba varchar(255)
)
RETURNS varchar(255)
AS
BEGIN
    if @Liczba >= 0 and @Liczba < 7 and substring(@Liczba, 3, 2) >= 0 and substring(@Liczba, 3, 2) <= 24
        Return (substring(@Liczba, 0, 1) + (0.19));
    if @Liczba >= 0 and @Liczba < 7 and substring(@Liczba, 3, 2) >= 25 and substring(@Liczba, 3, 2) <= 34
        Return (substring(@Liczba, 0, 1) + (0.29));
    if @Liczba >= 0 and @Liczba < 7 and substring(@Liczba, 3, 2) >= 35 and substring(@Liczba, 3, 2) <= 44
        Return (substring(@Liczba, 0, 1) + (0.39));
    if @Liczba >= 0 and @Liczba < 7 and substring(@Liczba, 3, 2) >= 45 and substring(@Liczba, 3, 2) <= 54
        Return (substring(@Liczba, 0, 1) + (0.49));
    if @Liczba >= 0 and @Liczba < 7 and substring(@Liczba, 3, 2) >= 55 and substring(@Liczba, 3, 2) <= 64
        Return (substring(@Liczba, 0, 1) + (0.59));
    if @Liczba >= 0 and @Liczba < 7 and substring(@Liczba, 3, 2) >= 65 and substring(@Liczba, 3, 2) <= 74
        Return (substring(@Liczba, 0, 1) + (0.69));
    if @Liczba >= 0 and @Liczba < 7 and substring(@Liczba, 3, 2) >= 75 and substring(@Liczba, 3, 2) <= 88
        Return (substring(@Liczba, 0, 1) + (0.79));
    if @Liczba >= 0 and @Liczba < 7 and substring(@Liczba, 3, 2) >= 89 and substring(@Liczba, 3, 2) <= 99
        Return (substring(@Liczba, 0, 1) + (0.99));

    if @Liczba >= 7 and @Liczba < 10 and substring(@Liczba, 3, 2) >= 0 and substring(@Liczba, 3, 2) <= 38
        Return (substring(@Liczba, 0, 1) + (0.29));
    if @Liczba >= 7 and @Liczba < 10 and substring(@Liczba, 3, 2) >= 39 and substring(@Liczba, 3, 2) <= 63
        Return (substring(@Liczba, 0, 1) + (0.49));
    if @Liczba >= 7 and @Liczba < 10 and substring(@Liczba, 3, 2) >= 64 and substring(@Liczba, 3, 2) <= 88
        Return (substring(@Liczba, 0, 1) + (0.79));
    if @Liczba >= 7 and @Liczba < 10 and substring(@Liczba, 3, 2) >= 89 and substring(@Liczba, 3, 2) <= 99
        Return (substring(@Liczba, 0, 1) + (0.99));

    if @Liczba >= 10 and @Liczba < 15 and substring(@Liczba, 4, 2) >= 0 and substring(@Liczba, 4, 2) <= 38
        Return (substring(@Liczba, 0, 2) + (0.29));
    if @Liczba >= 10 and @Liczba < 15 and substring(@Liczba, 4, 2) >= 39 and substring(@Liczba, 4, 2) <= 63
        Return (substring(@Liczba, 0, 2) + (0.49));
    if @Liczba >= 10 and @Liczba < 15 and substring(@Liczba, 4, 2) >= 64 and substring(@Liczba, 4, 2) <= 88
        Return (substring(@Liczba, 0, 2) + (0.79));
    if @Liczba >= 10 and @Liczba < 15 and substring(@Liczba, 4, 2) >= 89 and substring(@Liczba, 4, 2) <= 99
        Return (substring(@Liczba, 0, 2) + (0.99));

    if @Liczba >= 15 and @Liczba < 30 and substring(@Liczba, 4, 2) >= 0 and substring(@Liczba, 4, 2) <= 49
        Return (substring(@Liczba, 0, 2) + (0.49));
    if @Liczba >= 15 and @Liczba < 30 and substring(@Liczba, 4, 2) >= 50 and substring(@Liczba, 4, 2) <= 99
        Return (substring(@Liczba, 0, 2) + (0.99));

    if @Liczba >= 30 and @Liczba < 100 and substring(@Liczba, 4, 2) >= 0 and substring(@Liczba, 4, 2) <= 99
        Return (substring(@Liczba, 0, 2) + (0.99));
    if @Liczba >= 30 and @Liczba < 100 and substring(@Liczba, 4, 2) >= 0 and substring(@Liczba, 4, 2) <= 99
        Return (substring(@Liczba, 0, 3) + (0.99));
    if @Liczba >= 100 and @Liczba < 1000 and substring(@Liczba, 5, 2) >= 0 and substring(@Liczba, 5, 2) <= 99
        Return (substring(@Liczba, 0, 4) + (0.99));
    if @Liczba >= 1000 and @Liczba < 10000 and substring(@Liczba, 6, 2) >= 0 and substring(@Liczba, 6, 2) <= 99
        Return (substring(@Liczba, 0, 5) + (0.99));
    if @Liczba >= 10000 and @Liczba < 100000 and substring(@Liczba, 7, 2) >= 0 and substring(@Liczba, 7, 2) <= 99
        Return (substring(@Liczba, 0, 6) + (0.99));

    Return (@Liczba);
END

【问题讨论】:

这也一定是功课,因为我昨天已经看到了这段代码 不要转发您的(已关闭)问题;有一个编辑功能。使用上述功能改进您的问题并重新打开它。 【参考方案1】:

您将 varchar 与 int 值进行比较的地方,我认为您会遇到错误:

 if @Liczba >= 0 and @Liczba < 7 ...

我认为你应该在这里将变量转换为浮点数,但不要重复代码超过一次,我会这样创建一个新变量:

SET @Liczba_float=CAST( @Liczba AS DECIMAL(10,2));

然后像这样使用它,我将它与一个数字进行比较

 if @Liczba_float >= 0 and @Liczba_float < 7 ...
        

【讨论】:

以上是关于点后的Sql值更改[重复]的主要内容,如果未能解决你的问题,请参考以下文章

我需要在点后有2个符号[重复]

从 sql 中删除重复值

SQL表里列的数据重复批量更改

SQL Server中的小技巧(重复替换截取去空格去小数点后的位数)

承诺后的返回值[重复]

更改 SQL 列类型 [重复]