有人可以帮我完成这项小任务吗?我需要的是一个存储过程,它可以从表“a”中找到字符串中的重复字母(连续),之后创建一个新表“b”,其中只包含具有重复字母的字符串的id。 / p>
这样的事情:
表A
ID Name
1 Matt
2 Daave
3 Toom
4 Mike
5 Eddie
从该表中我可以看到Daave
,Toom
,Eddie
连续重复的字母,我想创建一个新表并列出他们的ID。类似的东西:
表B
ID
2
3
5
仅2,3,5,因为这是其名称中包含重复字母的字符串的ID。
我希望这是可以理解的,并且非常感谢任何帮助。
答案 0 :(得分:4)
在你的存储过程的答案中,你有两个错误,一个是在列名和LIKE子句之间缺少空格,第二个是在搜索参数周围缺少单引号。
我首先创建用户定义的标量函数,如果字符串包含重复的字母,则返回1:
<强> EDITED 强>
CREATE FUNCTION FindDuplicateLetters
(
@String NVARCHAR(50)
)
RETURNS BIT
AS
BEGIN
DECLARE @Result BIT = 0
DECLARE @Counter INT = 1
WHILE (@Counter <= LEN(@String) - 1)
BEGIN
IF(ASCII((SELECT SUBSTRING(@String, @Counter, 1))) = ASCII((SELECT SUBSTRING(@String, @Counter + 1, 1))))
BEGIN
SET @Result = 1
BREAK
END
SET @Counter = @Counter + 1
END
RETURN @Result
END
GO
创建函数后,只需从简单的SELECT
查询中调用它,如下所示:
SELECT
*
FROM
(SELECT
*,
dbo.FindDuplicateLetters(ColumnName) AS Duplicates
FROM TableName) AS a
WHERE a.Duplicates = 1
使用这种组合,您将只获得具有重复字母的行。
答案 1 :(得分:3)
在任何版本的SQL中,您都可以使用强力方法执行此操作:
select *
from t
where t.name like '%aa%' or
t.name like '%bb%' or
. . .
t.name like '%zz%'
如果您使用区分大小写的排序规则,请使用:
where lower(t.name) like '%aa%' or
. . .
答案 2 :(得分:1)
虽然这是一篇旧帖子,但是值得发布一个比蛮力方法更快的解决方案或者使用标量udf(通常会降低性能)的解决方案。使用NGrams8K这很简单。
--sample data
declare @table table (id int identity primary key, [name] varchar(20));
insert @table([name]) values ('Mattaa'),('Daave'),('Toom'),('Mike'),('Eddie');
-- solution #1
select id
from @table
cross apply dbo.NGrams8k([name],1)
where charindex(replicate(token,2), [name]) > 0
group by id;
-- solution #2 (SQL 2012+ solution using LAG)
select id
from
(
select id, token, prevToken = lag(token,1) over (partition by id order by position)
from @table
cross apply dbo.NGrams8k([name],1)
) prep
where token = prevToken
group by id; -- optional id you want to remove possible duplicates.
答案 3 :(得分:1)
这是单向的。
首先创建一个数字表
install.bat -r sap_som_b2b
然后使用
CREATE TABLE dbo.Numbers
(
number INT PRIMARY KEY
);
INSERT INTO dbo.Numbers
SELECT number
FROM master..spt_values
WHERE type = 'P'
AND number > 0;