LIKE的SQL SELECT查询

时间:2013-05-05 02:36:43

标签: sql sql-like

我有以下查询:

SELECT * FROM student WHERE ssn LIKE '%321321%';

但它返回那些带有113213213215的记录。如何更改它以便它只返回随后只有321321的记录。

2 个答案:

答案 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)

根据{{​​3}},

SELECT id from student WHERE locate('321321', ssn) > 0应该对你进行排序。一切顺利......