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

Mysql DB select from table where field语句java

mysql随机抽取数据

MySql SELECT * FROM table_name WHERE col_name IN (任何值)