【问题标题】:Stored Procedure to SELECT Last 6 Digits of Number选择最后 6 位数字的存储过程
【发布时间】:2011-06-03 17:41:45
【问题描述】:

我在 SQL 表中有一个数据字段,其中包含一个大数字(9 位,客户信息编号)。我想运行一个只选择数字的最后 6 位的存储过程。

类似:

SELECT (Last 6 Digits of num) FROM db
WHERE user = @user

有谁知道实现这个的方法吗?

【问题讨论】:

  • 使用RIGHT()函数,它接受一个变量和你想要的位数。在你的情况下RIGHT(myField, 6)。看我的回答
  • 您使用的是哪个 RDBMS?它看起来可能像 MS SQL Server,但您可能应该标记问题以便人们知道,除非您正在寻找严格的 ANSI SQL 答案。
  • 啊,是的,我使用的是 MS SQL Server。我的坏
  • 我编辑了您的帖子以包含sql-server 标签
  • 与其动态拆分,不如考虑将值的子元素存储在单独的列中,然后通过VIEW、计算列等连接它们。

标签: sql sql-server stored-procedures


【解决方案1】:
DECLARE @bigOne bigint

SET @bigOne = 999333444

SELECT RIGHT(@bigOne, 6)

返回具有指定字符数的字符串的右侧部分。 这里也是 Right() 函数的 MSDN: http://msdn.microsoft.com/en-us/library/ms177532.aspx

在你的情况下,你可以做:

SELECT RIGHT(num, 6) FROM db WHERE user=@user

只需将num 替换为数据库表中列的名称,并将db 更改为SELECT所在的表的名称。

【讨论】:

    【解决方案2】:

    假设num 是数字数据类型,您可以使用modulo 运算符轻松提取最后6 位数字:

    select num % 1000000 as num
    from db
    where user = ?
    

    【讨论】:

    • 处理数字数据类型时,它比字符串转换要快。
    • 唯一的细节是,这将抑制这些数字中的前导零,而字符串答案会将它们留在里面。
    【解决方案3】:

    假设 SQL Server,

    SELECT subtring(num,len(num)-6,6) FROM db
    WHERE user = @user
    

    其他口味可能会使用substr 而不是substring

    【讨论】:

    • 你为什么还要打Len()之类的电话,就用Right()拉右边的6位数。
    • 哦,哇,我从来不知道 SQL Server 有 right... 我的答案仍然很好:)
    【解决方案4】:

    将其转换为字符串,然后使用 SUBSTRING 和 LEN 仅拉取您需要的部分。

    【讨论】:

    • 这似乎相当昂贵,一个演员、一个长度和一个子字符串来获取一个数字的最后 6 位数字?
    【解决方案5】:

    这将准确地从您传递的参数中获取最后 6 位数字。

    有一点需要注意。在 SQL Server 2005 中,“\”(反斜杠)字符不会按 ISNUMERIC 返回 1。但它在 SQL Server 2008 中确实如此。这个函数应该在两个版本的 SQL Server 中都有效,因为我们只是在上面的第 7 个测试参数中排除了这个字符。

    打印正确(dbo.fnNumericDigits('5-555-555551-2345-6-'), 6)

    标量值函数:

    ALTER FUNCTION [dbo].[fnNumericDigits]
    (
        @startString NVARCHAR(255)
    ) RETURNS NVARCHAR(255)
    AS
    BEGIN
    
        DECLARE @returnString NVARCHAR(255)
        DECLARE @length INT, @currentDigit INT, @currentCharacter NVARCHAR(1)
        SELECT @length = LEN(@startString), @currentDigit = 1, @returnString = ''
    
        WHILE @currentDigit <= @length
        BEGIN
    
        SELECT @currentCharacter = SUBSTRING(@startString, @currentDigit, @currentDigit)
    
        IF ISNUMERIC(@currentCharacter) = 1 
            AND @currentCharacter != '$'
            AND @currentCharacter != '+'
            AND @currentCharacter != ','
            AND @currentCharacter != '-'
            AND @currentCharacter != '.'
            AND @currentCharacter != '\'
        BEGIN
        SELECT @returnString = @returnString + @currentCharacter
        END
    
        SELECT @currentDigit = @currentDigit + 1
    
    END
    
    RETURN @returnString
    END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 1970-01-01
      相关资源
      最近更新 更多