SQL只获取多个匹配数值的单个记录

时间:2016-05-02 15:17:48

标签: sql sql-server

我正在使用SQL Server 2008 R2 考虑两个名为ID和ID1的列,其值为以下值。

   ID         ¦ ID1
--------------¦-------
   A100       ¦ 101
   B100       ¦ 102
   OB100      ¦ 103
   D100A      ¦ 104
   Z100A      ¦ 105

任务是只检索其中一行,所以逻辑就像是数字位匹配(例如100)只获取其中一列,其中另一列(ID1)值为Max。

对于上述数据,查询将返回Z100A,因为它具有最大ID1值并忽略结果中的其他行。

2 个答案:

答案 0 :(得分:0)

首先,创建以下功能。此函数获取一个VARCHAR,其中包含一个数字(例如Z100A),然后返回其中的整数(例如。100)。

CREATE FUNCTION dbo.GetNumeric(@strAlphaNumeric VARCHAR(256))
    RETURNS VARCHAR(256)
AS
BEGIN
    DECLARE @intAlpha INT

    SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric)

    BEGIN
        WHILE @intAlpha > 0
        BEGIN
            SET @strAlphaNumeric = STUFF(@strAlphaNumeric, @intAlpha, 1, '' )
            SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric )
        END
    END

    RETURN ISNULL(@strAlphaNumeric,0)
END
GO


然后,您需要执行以下SELECT查询才能获得结果。
请注意,WHERE部分已注释。如果您想取消注释以强制进行更多限制:

SELECT  dbo.GetNumeric(ID) AS ID_Num, MAX(ID1) AS Max_ID1
FROM    MyIdTable
--WHERE dbo.GetNumeric(ID) = 100
GROUP   BY dbo.GetNumeric(ID)


如果您想获得ID这样的实际Z100A名称,请使用以下SELECT查询:
注意:ID中的提取数字已被注释,但如果您想在查询结果中使用它,则可以取消注释。

SELECT  MAX(ID)              AS ID,
        --dbo.GetNumeric(ID) AS ID_Num,
        MAX(ID1)             AS Max_ID1
FROM    MyIdTable
--WHERE dbo.GetNumeric(ID) = 100
GROUP   BY dbo.GetNumeric(ID)

答案 1 :(得分:0)

DECLARE @n nvarchar(10) = '100'

;WITH cte AS (
SELECT *
FROM (VALUES
('A100', 101),
('B100', 102),
('OB100', 103),
('D100A', 104),
('Z100A', 105)
) as t(ID, ID1)
)

SELECT c.ID 
FROM cte c
INNER JOIN (
    SELECT MAX(ID1) as ID1
    FROM cte
    WHERE ID LIKE '%'+@n+'%'
    ) as t 
        ON t.ID1 = c.ID1

输出:

ID
-----
Z100A

(1 row(s) affected)