具有静态右操作数的SQL IN()多列条件

具有静态右操作数的SQL IN()多列条件,sql,sqlite,Sql,Sqlite,我肯定知道这有一个正确的语法,但我不记得它是什么:我需要这样做 SELECT * FROM "table" WHERE ("dep_date","ret_date") IN (('2019-10-10','2019-10-15'),('2019-10-11','2019-10-16')) 除了这个语法不起作用。为IN()的右操作数定义静态多列查找的正确语法是什么?您可以按照下面的方法进行尝试- SELECT * FROM "table" WHERE ((

我肯定知道这有一个正确的语法,但我不记得它是什么:我需要这样做

SELECT
    *
FROM
    "table"
WHERE
    ("dep_date","ret_date") IN (('2019-10-10','2019-10-15'),('2019-10-11','2019-10-16'))

除了这个语法不起作用。为IN()的右操作数定义静态多列查找的正确语法是什么?

您可以按照下面的方法进行尝试-

SELECT
    *
FROM
    "table"
WHERE ((dep_date='2019-10-10' and ret_date='2019-10-15') or 
      (dep_date='2019-10-11' and ret_date='2019-10-16'))

你可以试试下面的方法-

SELECT
    *
FROM
    "table"
WHERE ((dep_date='2019-10-10' and ret_date='2019-10-15') or 
      (dep_date='2019-10-11' and ret_date='2019-10-16'))

在IN子句之后使用UNION ALL的子查询:

SELECT
    *
FROM
    "table"
WHERE  ("dep_date","ret_date") IN (
  select '2019-10-10', '2019-10-15' 
  union all
  select '2019-10-11','2019-10-16'
)

您可以在SQLite中找到有关行值的更多信息,请参见此处:

在in子句之后使用UNION ALL子查询:

SELECT
    *
FROM
    "table"
WHERE  ("dep_date","ret_date") IN (
  select '2019-10-10', '2019-10-15' 
  union all
  select '2019-10-11','2019-10-16'
)

您可以在SQLite中找到有关行值的更多信息:

该语法在PostgreSQL中确实有效。顺便说一句,您的数据库是什么?这是有效的SQL-99语法。双引号用于分隔标识符。应该工作得很好。嗯。。。根据SQL标准,“元组”是完全合法的。然而,很少有引擎能够完全支持它们。PostgreSQL就是一个很好的例子。Oracle、DB2和MariaDB为某些操作员提供了支持。SQL Server一点也不喜欢它们。@苹果MySQL也支持它们……显然不是SQLite。这种语法在PostgreSQL中确实有效。顺便说一句,您的数据库是什么?这是有效的SQL-99语法。双引号用于分隔标识符。应该工作得很好。嗯。。。根据SQL标准,“元组”是完全合法的。然而,很少有引擎能够完全支持它们。PostgreSQL就是一个很好的例子。Oracle、DB2和MariaDB为某些操作员提供了支持。SQL Server一点也不喜欢它们。@苹果MySQL也支持它们……显然不是SQLite。这不是对OP的直接回答。好吧,添加了
SQLite
标记后,它确实回答了这个问题。虽然我发现SQLite在(值('2019-10-13','2019-10-22'),('2019-10-13','2019-10-22'))中消化了
,但这似乎回避了任何指数优化;它实际上是将每一行上的条件视为布尔函数。所以这不好。因此,实际上最好的下一个选择似乎是将集合扩展到和/或条件……而不是直接回答OP。好吧,添加了
sqlite
标记,它确实回答了这个问题。虽然我发现SQLite在(值('2019-10-13','2019-10-22'),('2019-10-13','2019-10-22'))中消化了
,但这似乎回避了任何指数优化;它实际上是将每一行上的条件视为布尔函数。所以这不好。因此,实际上,最好的下一个选项似乎是将集合扩展为和/或条件…虽然此语法有效,但它似乎遇到了与(VALUES(),()…)中的
相同的问题:优化器无法解决此问题,而是将其视为每行的布尔条件,因此没有索引优化。虽然此语法有效,它似乎遇到了与(VALUES(),()…)
中的
相同的问题:优化器无法解决它,它实际上将它视为每行上的布尔条件,因此没有索引优化。