Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在前缀值和非前缀值之间找到重复值?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 如何在前缀值和非前缀值之间找到重复值?

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

在我的数据库中,此ID字符串的值如下所示:

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', '')