我有以下查询:
SELECT * FROM student WHERE ssn LIKE '%321321%';
但它返回那些带有113213213215的记录。如何更改它以便它只返回随后只有321321的记录。
答案 0 :(得分:1)
根据评论中的澄清,您正在寻找类似的内容:
SELECT *
FROM student
WHERE ssn LIKE '%321321%'
AND NOT ssn LIKE '%321321321%'; -- or: AND ssn NOT LIKE '%321321321%';
请注意,如果您需要排除321
的任意长(> = 4)重复,这将无效。如果需要,您将需要更复杂的模式匹配解决方案。
用户JW 웃
发布了一条评论,指出可以排除321
大于2的所有重复的解决方案(我原先认为这是错误的,他删除了他的评论,但他是正确的) :
SELECT ssn
FROM student
WHERE (LEN(ssn) - LEN(REPLACE(ssn, '321', ''))) / LEN('321') = 2;
如果可能的话,我会将其提取到数据库函数中。在SQL Server中,这看起来像:
CREATE FUNCTION SubStringCount
(@SourceString varchar(max), @SubString varchar(max))
RETURNS int
AS
BEGIN
DECLARE @fullLength int = LEN(@SourceString);
DECLARE @subStringLength int = LEN(@subString);
DECLARE @nonSubStringChars varchar(max) =
REPLACE(@SourceString, @SubString, '');
DECLARE @nonSubStringCharCount int = LEN(@nonSubStringChars);
DECLARE @subStringCharCount int = @fullLength - @nonSubStringCharCount;
DECLARE @subStringCount int = @subStringCharCount / @subStringLength;
RETURN @subStringCount;
END
然后可以将查询写为:
SELECT ssn
FROM student
WHERE dbo.SubStringCount(ssn, '321') = 2;
答案 1 :(得分:1)
SELECT id from student WHERE locate('321321', ssn) > 0
应该对你进行排序。一切顺利......