zoukankan      html  css  js  c++  java
  • django 在字符串[str(list)]中精确查找

    1.问题描述

    1.1表结构

    1.2问题

    ref_list为id列表的字符串,需要从ref_list中找出包含指定id的数据(eg id=8)。如果实用models.objects.filter(ref_list__contains=id)无法实现精确查找

    models.objects.filter(ref_list__contains='8')
    '''
    结果:
    1 | 8,9,10,11
    2 | 18,81
    3 | 23,8,33
    4 | 36,78,8
    5 | 37,98, 69
    有多余的数据,增加了时间消耗
    '''
    models.objects.filter(ref_list__contains=',8')
    models.objects.filter(ref_list__contains='8,')
    models.objects.filter(ref_list__contains=',8,')
    '''
    无法精确查抄,并且还会使部分包含id=8的数据无法查找到
    '''

    用django 内置数据库过滤API操作无法实现精确查找

    2.extra()

    函数原型:extra(params)

    参数说明:由于没有找到合适的资料,该部分暂时空缺。待找到在补充

    1 Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
    2 等价于
    3 SELECT * FROM blog_entry WHERE (foo='a' OR bar='a') AND (baz='a')

    3.使用sql实现列表查找

    3.1 FIND_IN_SET(str,strlist)

    说明:如果字符串str在由N子串组成的表strlist之中,返回一个1到N的值。一个字符串表是被“,”分隔的子串组成的一个字符串。如果第一个参数是一个 常数字符串并且第二个参数是一种类型为SET的列,FIND_IN_SET()函数被优化而使用位运算!如果str不是在strlist里面或如果 strlist是空字符串,返回0。如果任何一个参数是NULL,返回NULL。如果第一个参数包含一个“,”,该函数将工作不正常。 

    SQL> SELECT FIND_IN_SET('b','a,b,c,d');
    +---------------------------------------------------------+
    | SELECT FIND_IN_SET('b','a,b,c,d')                       |
    +---------------------------------------------------------+
    | 2                                                       |
    +---------------------------------------------------------+
    1 row in set (0.00 sec) 

    缺点:这个函数的问题是逗号中有空格无法识别,所以只能先用REPLACE把空格替换掉。

    3.2 REPLACE(str,from_str,to_str)

    说明:将str中所有的from_str替换为to_str,并返回处理后的结果

    1 mysql>   select   REPLACE( 'www.mysql.com ',   'w',   'Ww');
    2     ->   'WwWwWw.mysql.com '

    4 结果

    models.objects.extra(where=[FIND_IN_SET( '8', REPLACE( ref_list, ' ', ''))])
    '''
    1 | 8,9,10,11  
    3 | 23,8,33
    4 | 36,78,8
    精确查找
    '''

    5. 参考:

    MySQL比like语句更高效的写法locate position instr find_in_set
    Mysql中查找逗号分隔的字符串数据
    Django,数据模型创建之数据库API参考
    django中extra的用法

  • 相关阅读:
    扩展欧几里得(exgcd)与同余详解
    卡常模板
    文艺平衡树(区间翻转)
    Motto
    PKUWC2019划水记
    【模板】Splay(洛谷P3391)
    【PKUSC2018】最大前缀和
    【PKUWC2018】随机算法
    【PKUWC2018】Slay the Spire
    【PKUWC2018】Minimax
  • 原文地址:https://www.cnblogs.com/yunsicai/p/4113391.html
Copyright © 2011-2022 走看看