【问题标题】:SQL LIKE query inside array in Django pythonDjango python中数组内的SQL LIKE查询
【发布时间】:2018-09-28 05:16:41
【问题描述】:

我需要在数组中使用类似查询 我在 keywords_array 中有数组:["rk.keywords LIKE '%%Donut%%'", "OR rk.keywords LIKE '%%Pizza%%'"]

我需要在 raw_query 最后在 where 条件中添加它,但它正在返回单个数组(OR rk.keywords LIKE '%%Pizza%%') :

Views.py

                keywords_array=[]
                for i in keyword:
                    keywords={}
                    if keyword[0]==i:
                        keywords="rk.keywords LIKE '%%"+i+"%%'"
                    else:
                        keywords="OR rk.keywords LIKE '%%"+i+"%%'"
                    keywords_array.append(keywords)
                for t in keywords_array:
                    raw_query="SELECT r.id,( 3959 * Acos(Cos(Radians(" +lat +")) * Cos(Radians(lat)) * Cos( Radians(lng) - Radians("+lng+")) + Sin (Radians("+lat+")) * Sin(Radians(lat)))) AS distance FROM backend_restaurant r LEFT JOIN backend_restaurant_keywords m2m ON m2m.restaurant_id = r.id LEFT JOIN backend_restaurantkeyword rk ON m2m.id = rk.id WHERE "+ t +""

打印(原始查询)

SELECT r.id,( 3959 * Acos(Cos(Radians(30.704649)) * Cos(Radians(lat)) * Cos( Radians(lng) - Radians(76.717873)) + Sin (Radians(30.704649)) * Sin(Radians(lat)))) AS distance FROM backend_restaurant r LEFT JOIN backend_restaurant_keywords m2m ON m2m.restaurant_id = r.id LEFT JOIN backend_restaurantkeyword rk ON m2m.id = rk.id WHERE OR rk.keywords LIKE '%%Pizza%%'

【问题讨论】:

  • 您的原始查询处于 if else 条件下,因此您的数组中只有一个查询
  • 这个条件是在查询中追加 OR 是否返回数组 ["rk.keywords LIKE '%%Donut%%'", "OR rk.keywords LIKE '%%Pizza%%'" ]
  • 好的,我明白了。等待发布答案

标签: python django python-3.x django-views


【解决方案1】:

查看代码中的 cmets 以了解您做错了什么。

keywords_array=[]
for i in keyword:
    # keywords={} # unnecessary i think
    if keyword[0]==i:
        keywords="rk.keywords LIKE '%%"+i+"%%'"
    else:
        keywords="OR rk.keywords LIKE '%%"+i+"%%'"
    keywords_array.append(keywords)

# your variable raw_query was inside for loop and so its value was getting overwritten every loop,
# therefore it contained the last element of keywords_array only
# so define the contents of string which you always want to keep outside for loop
raw_query="SELECT r.id,( 3959 * Acos(Cos(Radians(" +lat +")) * Cos(Radians(lat)) * Cos( Radians(lng) - Radians("+lng+")) + Sin (Radians("+lat+")) * Sin(Radians(lat)))) AS distance FROM backend_restaurant r LEFT JOIN backend_restaurant_keywords m2m ON m2m.restaurant_id = r.id LEFT JOIN backend_restaurantkeyword rk ON m2m.id = rk.id WHERE "

# Now use '+=' to append new text to end of string the string instead of '=' which replaces the string
for t in keywords_array:
    raw_query += t + " "  # update the string instead of overwriting it

print(raw_query)

【讨论】:

  • 很高兴为您提供帮助。?
【解决方案2】:

你的问题是这样的:

你有一个数组Keywords=["Donut", "Pizza", "Burger"]

你想要这个循环

SELECT * FROM items WHERE name LIKE '%Pizza%' 
                       OR name LIKE '%Donut%' 
                       OR name LIKE '%Burger%';

【讨论】:

  • 同名,不同的人?
猜你喜欢
  • 2013-08-11
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
  • 2016-06-29
  • 1970-01-01
  • 2021-01-26
相关资源
最近更新 更多