2

这听起来很傻,但相信我,这是为了一个好的(即过度设计的)原因。

是否可以使用 IN 子句编写 SQL 查询,该子句选择该表中的所有内容而不知道该表的任何内容?请记住,这意味着您不能使用引用该表的子查询。

换句话说,我想在以下查询中找到一个替换“SOMETHING”的语句:

SELECT * FROM table_a WHERE table_a.id IN (SOMETHING)

以便结果与以下内容相同:

SELECT * FROM table_a

除了改变“某事”的价值之外什么都不做


为了满足好奇,我将分享这个问题的原因。

1) 我有一个 FactoryObject 抽象类,它使用两个模板方法授予所有扩展它的模型一些光荣的工厂方法魔法:getData() 和 load()

2) 模型必须实现模板方法。getData 是一个静态方法,它接受 ID 约束、从数据库中提取行并返回一组关联数组。load 不是静态的,接受关联数组,并根据该数组填充对象。

3)FactoryObject的非抽象部分实现了一个getObject()和一个getObjects()方法。这些调用 getData、创建对象和 load() 来自 getData 的数组响应以创建和返回填充对象。

getObjects() 需要 ID 约束作为输入,可以是列表形式,也可以是子查询形式,然后将其传递给 getData()。我希望可以不传递任何 ID 约束来获取所有对象。

问题是只有模型知道他们的表。getObjects() 是在更高级别实现的,因此它不知道要传递什么 getData(),除非 IN 有一个通用的“返回所有内容”子句。

还有其他解决方案。我可以修改 API 以要求 getData 接受特殊参数并返回所有内容,或者我可以在模型级别实现静态 getAll[ModelName]s() 方法,该方法调用:

static function getAllModelObjects() {
    return getObjects("select [model].id from [model]");
}

这是合理的,无论如何可能适合架构,但我很好奇,所以我想我会问!

4

5 回答 5

4

适用于 SQL Server:

SELECT * FROM table_a WHERE table_a.id IN (table_a.id)
于 2012-05-08T02:27:32.070 回答
2

好吧,我讨厌说不,所以我不得不为你想出另一个解决方案。

由于 mysql 是开源的,因此您可以获取源代码并合并一个可以理解无穷大符号的新功能。然后你只需要让 mysql 社区接受这个功能的有用性(在你尝试这样做时尽可能避免讨论安全问题),然后让你的公司将他们的 dbms 升级到新版本一次此功能已实现。

问题解决了。

于 2012-05-08T02:48:51.297 回答
1

答案很简单。解决方法是添加一些标准,如下所示:

# to query on a number column
AND (-1 in (-1) OR sample_table.sample_column in (-1))  

# or to query on a string column
AND ('%' in ('%') OR sample_table.sample_column in ('%')) 

因此,在您的示例中,只要您将 -1 作为参数值传递,以下两个查询应该返回相同的结果。

SELECT * FROM table_a;
SELECT * FROM table_a WHERE (-1 in (-1) OR table_a.id in (-1));

每当您想过滤掉某些东西时,您都可以将其作为参数传递。例如,在以下查询中,过滤了 id 为 1、2 和 6 的记录。

SELECT * FROM table_a WHERE (-1 in (1, 2, 6) OR table_a.id in (1, 2, 6));

在这种情况下,我们有一个像 -1 或 % 这样的默认值,并且我们有一个可以是任何值的参数。如果参数是默认值,则不过滤任何内容。

如果您正在查询文本列,我建议将 % 字符作为默认值,如果您正在查询表的 PK,我建议使用 -1。但这完全取决于您将 % 或 -1 替换为您决定的任何保留字符或数字。

于 2016-10-05T17:24:33.407 回答
0

怎么样:

select * from table_a where table_a.id not ine ('somevaluethatwouldneverpossiblyexistintable_a.id')

编辑:

尽管我很想继续想办法解决你的问题,但我知道没有办法,所以我想我会继续做第一个告诉你的人,这样我至少可以得到荣誉答案。不过,这确实是一场苦乐参半的胜利:/

如果您提供更多信息,也许我或其他人可以帮助您考虑另一种解决方法。

于 2012-05-08T02:32:17.283 回答
0

类似于@brandonmoore:

select * from table_a where table_a.id not in ('0') 
于 2012-05-08T02:34:11.630 回答