我现在有一张表A,其中有个字段为name,我现在输入'XXXX'几个字,我现在想把name字段包含,部分包含'XXXX',或者'XXXX'的倒序的记录取出来。各位路过的,麻烦指点下。我把所有的条件组合起来,用or串联起来,结果发现查询速度有点慢,表中大约100万条记录左右,以后也不会有大幅度增加。

解决方案 »

  1.   

    举个例子吧,如果是 abc-〉cba 用函数就行REVERSE ('abc')
      

  2.   

    就是比如,我查询 '美丽佳人', 那么相应的记录name字段为 '美丽', '佳人','美丽佳人','美丽国家','人佳丽美'....都应该出现在结果中.
      

  3.   


    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
      

  4.   

    select * from A
    where name like '%XXXX' 
    order by desc
      

  5.   

    select *
    from TableA
    where (name like '%美丽%') or (name like '%丽美%') or (name like '%佳人%') or (name like '%人佳%')
      

  6.   

    谢谢了..我仔细看看..不是很了解sql代码。。看习惯c++了。。
      

  7.   

    还有哪个牛人,给个solution啊。。
    补充一下,我的数据库是mysql