MySql SELECT * FROM table_name WHERE col_name IN (任何值)
Posted
技术标签:
【中文标题】MySql SELECT * FROM table_name WHERE col_name IN (任何值)【英文标题】:MySql SELECT * FROM table_name WHERE col_name IN (any value) 【发布时间】:2021-01-21 14:28:23 【问题描述】:我正在动态生成一个 python 元组
x = (1, 3)
所以我可以像下面这样在 python 中使用 mysql 查询,
f"SELECT * FROM table_name WHERE col_name IN x"
它没有问题。
但是当我使用空元组作为 x (x = ()
) 时,我希望查询返回表的所有值(只需忽略条件)
我知道我可以在 python 中使用 if 并仅在 x 不为 null 时将过滤器传递给 sql。 但是我想在sql中使用它这样会更容易,因为实际的查询字符串很长并且在很多地方都有同样的问题。
所以我的问题是,
在 MYSQL 中是否有类似下面的方法,
SELECT * FROM table_name WHERE col_name IN (%)
就像我们使用的一样
SELECT * FROM table_name WHERE col_name LIKE "%"
【问题讨论】:
为什么不直接构建查询呢?有一个循环遍历所有这些条件并根据元组添加正确的字符串,我认为您不会为此找到任何 SQL hack。 【参考方案1】:想出了这个python方式。像这样定义一个函数:
def queryfriendly(value):
if isinstance(value, str):
return f'"value"'
return str(value)
def tuple_to_condition(col_name, tup):
if len(tup):
return f'col_name IN (' + ', '.join(list(map(queryfriendly, tup))) + ')'
return 'TRUE'
现在在您的查询字符串中执行以下操作:
f"SELECT * FROM table_name WHERE tuple_to_condition('col_name', x)"
该函数只返回 'TRUE',以便 WHERE 不会引发错误。
【讨论】:
是的,我刚刚注意到了。非常感谢您的回答。这是 100% 的工作。 虽然这可能会破坏字符串。啊,当您从字符串动态构建 SQL 时的问题。我建议只研究像 SQLAlchemy 这样的库来简单地完成所有这些工作。 @KavinduPasanKavithilaka 刚刚编辑,因此它也适用于字符串,请注意有各种数据类型(例如日期)可能无法正常工作,您需要向queryfriendly
函数添加更多内容。更不用说我们没有在这里清理输入!非常危险(SQL 注入的可能性)建议使用一些库,如 SQLAlchemy 的上述建议。【参考方案2】:
def sql_escape(s, replace_all=False):
if replace_all:
s = s.replace("_", "\\_").replace("%", "\\%")
return s.replace("\\", "\\\\") \
.replace("\'", "\\\'") \
.replace("\"", "\\\"")
def sql_in(col, values, default="TRUE"):
if values is None:
return default
values = set(values) - ""
if len(values):
values = ",".join("\'" + sql_escape(str(v).strip()).replace("%", "\\%").replace("_", "\\_") + "\'"
for v in values)
return f"col IN (values)"
else:
return default
【讨论】:
【参考方案3】:在尝试了一些代码后,我找到了答案。
x = [value1, value 2] # a list,, not a tuple
x.append("some value that does not in table")
x = tuple(x)
所以元组不会为空。 现在我们可以从 eshirvana 的回答中得到帮助
SELECT * FROM table_name WHERE col_name IN x OR len(x) > 1
【讨论】:
嘿,刚刚注意到只有一个元素的元组具有像(1,)
这样的字符串表示,这会导致 SQL 抛出错误,它对你有用吗?
是的,我刚刚收到错误消息,我正在处理它
请检查我对这个问题的回答,我修改它来解决这个问题。以上是关于MySql SELECT * FROM table_name WHERE col_name IN (任何值)的主要内容,如果未能解决你的问题,请参考以下文章
MYSQL IF SELECT COUNT() 大于零 select * from table else return nothing found
MYSQL中 select * from table1 t1, table2 t2 where t1.name= t2.name
MySQL SELECT * WHERE column ='value'from 2 tables