1

我正在尝试使用WHERE实际上不过滤任何内容的子句编写 SQL 查询。

import cx_Oracle
condition = []
#condition = ['a', 'b']

query = ("""
    SELECT *
    FROM table
    WHERE var = {}""".format(tuple(condition)))

with cx_Oracle.connect(dsn=tsn), encoding="UTF-8")) as con:
    df = pd.read_sql(con=con, sql=query)

免责声明:对 SQL 来说还是有点新。我感谢对术语的更正

编辑:

4

3 回答 3

2

这通常使用如下逻辑处理:

where col = :input_val or :input_val is null
于 2020-06-06T15:16:26.757 回答
0

如果您不想让 WHERE 子句过滤任何内容,那么它需要包含一个始终为真的条件;就像是

SELECT *
  FROM table1
  WHERE var = var OR
        var IS NULL

db<>在这里摆弄

于 2020-06-06T15:41:25.560 回答
0

如果您需要使用索引并且列值不可为空,那么您将需要使用该NVL技巧。我不知道为什么,但 Oracle 对表达式的优化NVL比对...OR A IS NULL表达式的优化要好。

SELECT *
FROM table
WHERE nvl(anyvalueofvar1, var) = var;

有关由这种不同语法生成的更好执行计划的示例,请参见我的答案。

(我说“并且列值不能为空”,因为NULL = NULL在 Oracle 中不是这样,所以NVL如果列有空值,则表达式将不起作用。我通常讨厌这些行为怪异的神秘语法,但它们有时对于性能是必需的。 )

于 2020-06-07T06:55:17.557 回答