我正在使用SQL Server 2008 R2 考虑两个名为ID和ID1的列,其值为以下值。
ID ¦ ID1
--------------¦-------
A100 ¦ 101
B100 ¦ 102
OB100 ¦ 103
D100A ¦ 104
Z100A ¦ 105
任务是只检索其中一行,所以逻辑就像是数字位匹配(例如100)只获取其中一列,其中另一列(ID1)值为Max。
对于上述数据,查询将返回Z100A,因为它具有最大ID1值并忽略结果中的其他行。
答案 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)