求一sql语句思路

bobye1230 2010-08-05 08:53:14
我现在有一张表A,其中有个字段为name,我现在输入'XXXX'几个字,我现在想把name字段包含,部分包含'XXXX',或者'XXXX'的倒序的记录取出来。

各位路过的,麻烦指点下。我把所有的条件组合起来,用or串联起来,结果发现查询速度有点慢,表中大约100万条记录左右,以后也不会有大幅度增加。
...全文
87 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hao1hao2hao3 2010-08-05
  • 打赏
  • 举报
回复
中文分词?很好,很强大。
bobye1230 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 oraclers 的回复:]
select *
from TableA
where (name like '%美丽%') or (name like '%丽美%') or (name like '%佳人%') or (name like '%人佳%')
[/Quote]
这样写,执行很慢的,我试过的
bobye1230 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 luo8907203306 的回复:]
select * from A
where name like '%XXXX'
order by desc
[/Quote]
汗一个
bobye1230 2010-08-05
  • 打赏
  • 举报
回复
谢谢了..我仔细看看..不是很了解sql代码。。看习惯c++了。。

[Quote=引用 5 楼 shmilywcd 的回复:]
SQL code

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 ……
[/Quote]
Oraclers 2010-08-05
  • 打赏
  • 举报
回复
select *
from TableA
where (name like '%美丽%') or (name like '%丽美%') or (name like '%佳人%') or (name like '%人佳%')
luo8907203306 2010-08-05
  • 打赏
  • 举报
回复
select * from A
where name like '%XXXX'
order by desc
天-笑 2010-08-05
  • 打赏
  • 举报
回复

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.id

DROP TABLE tb
bobye1230 2010-08-05
  • 打赏
  • 举报
回复
就是比如,我查询 '美丽佳人', 那么相应的记录name字段为 '美丽', '佳人','美丽佳人','美丽国家','人佳丽美'....都应该出现在结果中.
xiaoxiao8372 2010-08-05
  • 打赏
  • 举报
回复
没看明白啥意思!
永生天地 2010-08-05
  • 打赏
  • 举报
回复
举个例子吧,如果是 abc-〉cba 用函数就行

REVERSE ('abc')
天-笑 2010-08-05
  • 打赏
  • 举报
回复
给个 查询例子吧,没看明白
bobye1230 2010-08-05
  • 打赏
  • 举报
回复
还有哪个牛人,给个solution啊。。
补充一下,我的数据库是mysql。。。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧