比较两个数字SQL

时间:2015-12-16 09:34:16

标签: sql sql-server case common-table-expression

在SQL中,我试图比较同一字段中的两个数字。两个数字都包含不同的信息,但由于某些技术原因,它们是相同的。问题是当存在一个长度为5的子字符串和另一个长度为4的子字符串且两者的最后4位数字相同时。我想获得长度为5的第一个字符串。

示例:

--------------------------------
|ID | Number| Description        |
---------------------------------
| 1 | 12345 | Project X,Ready    |
---------------------------------
| 2 |  2345 | Project X,onDesign |
---------------------------------   

如果存在最后4位相同的数字,我应该总是得到12345(或最大的一个)。是否有任何CASE或CTE声明可以让我轻松解决这个问题?

5 个答案:

答案 0 :(得分:3)

试试这个:

SELECT Id
,Number
,Description
FROM (
SELECT Id
    ,Number
    ,Description
    ,rank() OVER (PARTITION BY right(cast([Number] AS VARCHAR(20)), 4) ORDER BY Number DESC) AS Ranking
FROM YourTable
) InnerTable
WHERE ranking = 1

答案 1 :(得分:0)

所以你需要使用最后4位数加入。您可以使用简单的MOD运算符来完成此操作。它在SQL Server中用作百分号。

SELECT 12345 % 10000;

这会输出2345。正是我们正在寻找的。

因此我们可以构建以下查询以使用该计算:

DECLARE @Test TABLE
(
    ID INT
    , Number INT
    , Description VARCHAR(500)
);

INSERT INTO @Test(ID, Number, Description)
VALUES (1, 12345, 'Project X,Ready')
    , (2, 2345, 'Project X,onDesign');

SELECT T1.*
FROM @Test AS T1
INNER JOIN @Test AS T2
    ON T2.Number = T1.Number % 10000
WHERE T2.Number <> T1.Number;

输出:

╔════╦════════╦═════════════════╗
║ ID ║ Number ║   Description   ║
╠════╬════════╬═════════════════╣
║  1 ║  12345 ║ Project X,Ready ║
╚════╩════════╩═════════════════╝

请注意,我已添加WHERE T2.Number <> T1.Number。它消除了相同的数字,因为SELECT 2345 % 10000也是2345

更新

可以使用ROW_NUMBER()

完成此操作
;WITH Data (ID, Number, Description, RN)
AS (
    SELECT ID
        , Number
        , Description
        , ROW_NUMBER() OVER (PARTITION BY Number % 10000 ORDER BY Number DESC)
    FROM @Test
    )
SELECT *
FROM Data
WHERE RN = 1;

这将执行经典的row_number。它将按Number % 10000对窗口进行分区,这意味着12345和2345将落在同一窗口下,并且最高的数字将始终位于第一位。

答案 2 :(得分:0)

查询可能是RDBMS特定的。例如,对于MSSQL,你可以这样做:

'port' => 26,
编辑:啊,你编辑了,这是一个INT!然后你可以使用%运算符而不是substring。

CTE示例:

SELECT  *
FROM    myTable AS d1
WHERE   NOT EXISTS ( SELECT *
                     FROM   myTable AS d2
                     WHERE  SUBSTRING(d2.number, 2, 4) = d1.number );

答案 3 :(得分:0)

以下是public class MainViewModel { //INPC omitted for brevity public object CurrentViewModel { get; private set; } public void MainViewModel() { this.CurrentViewModel = new LoginViewModel(LoginComplete); } private void LoginComplete() { this.CurrentViewModel = new NavigationViewModel(); } } public class LoginViewModel { private Action loginCompleteAction; public void LoginViewModel(Action loginCompleteAction) { this.loginCompleteAction = loginCompleteAction; } private void UserHasLoggedIn() { this.loginCompleteAction(); } } 的示例:

not exists

输出:

DECLARE @t TABLE
    (
      ID INT ,
      Number INT ,
      Description VARCHAR(100)
    )

INSERT  INTO @t
VALUES  ( 1, 12345, 'Project 1' ),
        ( 2, 2345, 'Project 2' ),
        ( 3, 77777, 'Project 3' ),
        ( 4, 7777, 'Project 4' ),
        ( 5, 88888, 'Project 5' ),
        ( 6, 9999, 'Project 6' )

SELECT * FROM @t t1
WHERE NOT EXISTS(SELECT * FROM @t t2 
                 WHERE t2.ID <> t1.ID AND 
                 CAST(t2.Number AS VARCHAR(10)) LIKE '%' + CAST(t1.Number AS VARCHAR(10)))

答案 4 :(得分:0)

试试这个:

SELECT DISTINCT A.*
FROM [Tablename] AS A
INNER JOIN [Tablename] AS B
ON B.Number =RIGHT(A.Number,4)
WHERE B.Number <> A.Number;

RIGHT(A.Number,4)会比较最后4位数字并给出输出