SQL使用任意IN子句选择所有内容

时间:2012-05-08 02:24:08

标签: mysql sql

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

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

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

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

以便结果与:

相同
SELECT * FROM table_a

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


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

1)我有一个FactoryObject抽象类,它使用两个factory method:getData()和load()

授予所有扩展它的模型一些光荣的template methods魔法。

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

3)FactoryObject的非抽象部分实现了getObject()和getObjects()方法。这些调用getData,创建对象,并从getData加载()数组响应,以创建和返回填充的对象。

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

问题是只有模特知道他们的桌子。 getObjects()是在更高级别实现的,因此它不知道传递getData()的内容,除非IN有一个通用的“return everything”子句。

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

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

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

5 个答案:

答案 0 :(得分:4)

适用于SQL Server:

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

答案 1 :(得分:2)

好的,我讨厌说不,所以我不得不为你提出另一种解决方案。

由于mysql是opensource,因此您可以获取源代码并合并一个了解无穷大符号的新功能。然后你只需要让mysql社区购买这个功能的有用性(尽可能在你的尝试中尽可能远离安全性),然后让你的公司将他们的dbms升级到新版本此功能已实施。

问题解决了。

答案 2 :(得分:0)

怎么样:

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

编辑:

尽管我想继续想办法解决你的问题,但我知道没有办法让我知道我会继续成为第一个告诉你的人,所以我至少可以得到答案的功劳。尽管如此,这确实是一个苦乐参半的胜利:/

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

答案 3 :(得分:0)

类似于@brandonmoore:

select * from table_a where table_a.id not in ('0') 

答案 4 :(得分:0)

答案很简单。解决方法是添加一些标准:

# 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作为参数值传递-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或%,我们有一个参数可以是任何东西。如果参数是默认值,则不会过滤任何内容。

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