CREATE TABLE tb (ID INT IDENTITY(1,1),VALUE VARCHAR(100)) INSERT tb SELECT '中国' UNION ALL SELECT '中国人' UNION ALL SELECT '中国人民' UNION ALL SELECT '日本' UNION ALL SELECT '日本人' UNION ALL SELECT '我的心中有人姑娘' UNION ALL SELECT '人民网' UNION ALL SELECT '中国是个伟大的国家' UNION ALL SELECT '我们都是中国人,都是炎黄子孙,都是龙人传人'DECLARE @searchSTR VARCHAR(20) SET @searchSTR='中国人' SELECT ID,VALUE FROM tb a INNER JOIN fn_SplitStringToROWS(@searchSTR) b ON CHARINDEX(b.v,a.VALUE)>0 WHERE VALUE LIKE '%[中国人]%' GROUP BY ID,VALUE ORDER BY COUNT(DISTINCT v) DESC
DROP TABLE tb --附函数 CREATE FUNCTION fn_SplitStringToROWS ( @str VARCHAR(100) ) RETURNS @t TABLE(v VARCHAR(2)) AS BEGIN DECLARE @i INT SET @i=1 WHILE @i<=LEN(@str) BEGIN INSERT @t SELECT SUBSTRING(@str,@i,1) SET @i=@i+1 END RETURN END /* (所影响的行数为 9 行)ID VALUE ----------- ---------------------------------------------------------------------------------------------------- 9 我们都是中国人,都是炎黄子孙,都是龙人传人 2 中国人 3 中国人民 8 中国是个伟大的国家 1 中国 6 我的心中有人姑娘 7 人民网 5 日本人(所影响的行数为 8 行)*/如果要实现匹配度排序,那么可以去掉 WHERE ... LIKE那句,多余如果只想实现模糊的匹配,那么可以不需要连表,直接SELECT ID,VALUE FROM tb WHERE VALUE LIKE '%[中国人]%' 即可. 按词匹配. create function f_splitIDX(@SourceSql varchar(8000),@StrSeprate varchar(10)) returns @temp table(id int identity(1,1),v varchar(100))begin declare @i int set @SourceSql=rtrim(ltrim(@SourceSql)) set @i=charindex(@StrSeprate,@SourceSql) while @i>=1 begin insert @temp values(left(@SourceSql,@i-1)) set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i) set @i=charindex(@StrSeprate,@SourceSql) end if @SourceSql<>'\' insert @temp values(@SourceSql) return end CREATE TABLE tb (ID INT IDENTITY(1,1),VALUE VARCHAR(100)) INSERT tb SELECT '中国' UNION ALL SELECT '中国人,中国' UNION ALL SELECT '中国,中国人' UNION ALL SELECT '中国人民' UNION ALL SELECT '中国' UNION ALL SELECT '日本' UNION ALL SELECT '日本人' UNION ALL SELECT '我的心中有人姑娘' UNION ALL SELECT '人民网' UNION ALL SELECT '中国是个伟大的国家' UNION ALL SELECT '我们都是中国人,都是炎黄子孙,都是龙人传人' DECLARE @searchSTR VARCHAR(20) SET @searchSTR='中国人 中国'SELECT a.ID,VALUE FROM tb a INNER JOIN dbo.f_splitIDX(@searchSTR,' ') b ON CHARINDEX(v,VALUE)>0 GROUP BY a.ID,Value ORDER BY COUNT(DISTINCT v) DESC,MIN(b.id),a.idDROP TABLE tb
select * from A where name like '%XXXX' order by desc
select * from TableA where (name like '%美丽%') or (name like '%丽美%') or (name like '%佳人%') or (name like '%人佳%')
CREATE TABLE tb (ID INT IDENTITY(1,1),VALUE VARCHAR(100))
INSERT tb SELECT '中国'
UNION ALL SELECT '中国人'
UNION ALL SELECT '中国人民'
UNION ALL SELECT '日本'
UNION ALL SELECT '日本人'
UNION ALL SELECT '我的心中有人姑娘'
UNION ALL SELECT '人民网'
UNION ALL SELECT '中国是个伟大的国家'
UNION ALL SELECT '我们都是中国人,都是炎黄子孙,都是龙人传人'DECLARE @searchSTR VARCHAR(20)
SET @searchSTR='中国人'
SELECT ID,VALUE FROM tb a
INNER JOIN fn_SplitStringToROWS(@searchSTR) b
ON CHARINDEX(b.v,a.VALUE)>0
WHERE VALUE LIKE '%[中国人]%'
GROUP BY ID,VALUE
ORDER BY COUNT(DISTINCT v) DESC
DROP TABLE tb
--附函数
CREATE FUNCTION fn_SplitStringToROWS
(
@str VARCHAR(100)
)
RETURNS @t TABLE(v VARCHAR(2))
AS
BEGIN
DECLARE @i INT
SET @i=1
WHILE @i<=LEN(@str)
BEGIN
INSERT @t SELECT SUBSTRING(@str,@i,1)
SET @i=@i+1
END
RETURN
END
/*
(所影响的行数为 9 行)ID VALUE
----------- ----------------------------------------------------------------------------------------------------
9 我们都是中国人,都是炎黄子孙,都是龙人传人
2 中国人
3 中国人民
8 中国是个伟大的国家
1 中国
6 我的心中有人姑娘
7 人民网
5 日本人(所影响的行数为 8 行)*/如果要实现匹配度排序,那么可以去掉 WHERE ... LIKE那句,多余如果只想实现模糊的匹配,那么可以不需要连表,直接SELECT ID,VALUE FROM tb WHERE VALUE LIKE '%[中国人]%' 即可. 按词匹配. create function f_splitIDX(@SourceSql varchar(8000),@StrSeprate varchar(10))
returns @temp table(id int identity(1,1),v varchar(100))begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>'\'
insert @temp values(@SourceSql)
return
end
CREATE TABLE tb (ID INT IDENTITY(1,1),VALUE VARCHAR(100))
INSERT tb SELECT '中国'
UNION ALL SELECT '中国人,中国'
UNION ALL SELECT '中国,中国人'
UNION ALL SELECT '中国人民'
UNION ALL SELECT '中国'
UNION ALL SELECT '日本'
UNION ALL SELECT '日本人'
UNION ALL SELECT '我的心中有人姑娘'
UNION ALL SELECT '人民网'
UNION ALL SELECT '中国是个伟大的国家'
UNION ALL SELECT '我们都是中国人,都是炎黄子孙,都是龙人传人'
DECLARE @searchSTR VARCHAR(20)
SET @searchSTR='中国人 中国'SELECT a.ID,VALUE FROM tb a
INNER JOIN dbo.f_splitIDX(@searchSTR,' ') b
ON CHARINDEX(v,VALUE)>0
GROUP BY a.ID,Value
ORDER BY COUNT(DISTINCT v) DESC,MIN(b.id),a.idDROP TABLE tb
where name like '%XXXX'
order by desc
from TableA
where (name like '%美丽%') or (name like '%丽美%') or (name like '%佳人%') or (name like '%人佳%')
补充一下,我的数据库是mysql