Sql 如何在前缀值和非前缀值之间找到重复值?
在我的数据库中,此ID字符串的值如下所示:Sql 如何在前缀值和非前缀值之间找到重复值?,sql,sql-server,tsql,Sql,Sql Server,Tsql,在我的数据库中,此ID字符串的值如下所示: My_ID_String ============= ABC123 123 ABC456 798 我的最终目标是用无前缀替换任何包含ABC的内容。但我遇到的挑战是,本专栏必须具有唯一的值。我有一个解决这个问题的计划。然而,如果我把前缀去掉,我要做的是识别那些有重复的前缀。换句话说,我希望查询返回ABC456的结果,而不是ABC123的结果,因为如果执行replace函数,这将导致重复 预期成果: My_ID_String ============ A
My_ID_String
=============
ABC123
123
ABC456
798
我的最终目标是用无前缀替换任何包含ABC的内容。但我遇到的挑战是,本专栏必须具有唯一的值。我有一个解决这个问题的计划。然而,如果我把前缀去掉,我要做的是识别那些有重复的前缀。换句话说,我希望查询返回ABC456的结果,而不是ABC123的结果,因为如果执行replace函数,这将导致重复
预期成果:
My_ID_String
============
ABC456
您可以使用:
SELECT My_Id_String AS MyIdString
FROM tab
WHERE My_Id_String LIKE 'ABC%'
EXCEPT
SELECT 'ABC' + My_Id_String
FROM tab
WHERE My_Id_String NOT LIKE 'ABC%'
这就是你想做的吗
WITH StrTable AS
(
SELECT 'ABC123' My_ID_String
UNION
SELECT '12355555'
UNION
SELECT 'ABC456'
UNION
SELECT NULL
UNION
SELECT 'DEF123'
UNION
SELECT 'DEF456'
UNION
SELECT 'GHI123'
UNION
SELECT 'GHI456'
UNION
SELECT 'GHI789'
)
SELECT CONCAT( LEFT(My_ID_String, 3),
MAX(REPLACE(My_ID_String, LEFT(My_ID_String, 3), ''))
) Result
FROM StrTable
WHERE TRY_CAST(LEFT(My_ID_String, 3) AS INT) IS NULL
AND My_ID_String IS NOT NULL
GROUP BY LEFT(My_ID_String, 3);
返回:
只是另一种选择
范例
返回
因为这里的最终目标似乎是获得所有不同的值,您可以在一个步骤中完成这两部分。只需获取所需的不同值,同时消除重复项。像这样的东西可能就是你想要的
declare @Something table
(
My_ID_String varchar(50)
)
insert @Something values
('ABC123')
, ('123')
, ('ABC456')
, ('798')
select case when count(replace(s.My_ID_String, 'ABC', '')) = 1 then max(s.My_ID_String) else max(replace(s.My_ID_String, 'ABC', '')) end
from @Something s
group by replace(s.My_ID_String, 'ABC', '')
;with cte as (
Select Top 1 with ties *
From YourTable
Order By sum(1) over (partition by replace(My_ID_String,'ABC','') )
)
Select *
From cte
Where My_ID_String like 'ABC%'
My_ID_String
ABC456
declare @Something table
(
My_ID_String varchar(50)
)
insert @Something values
('ABC123')
, ('123')
, ('ABC456')
, ('798')
select case when count(replace(s.My_ID_String, 'ABC', '')) = 1 then max(s.My_ID_String) else max(replace(s.My_ID_String, 'ABC', '')) end
from @Something s
group by replace(s.My_ID_String, 'ABC', '')