【问题标题】:SQL "In" Statement Match AnythingSQL“In”语句匹配任何东西
【发布时间】:2009-12-09 04:41:27
【问题描述】:

如果我有这样的查询

SELECT * FROM table1 WHERE col1 IN ({SUBS})

我可以用什么来替换 {SUBS} 以返回表中的所有行吗?

更多细节:

我正在我的应用程序中动态构建 SQL,因此我不能(不应该)编辑查询的其他部分,除了大括号中的内容。所以,

SELECT * FROM table1

不会。

还有,

SELECT * FROM table1 WHERE col1 IN (SELECT col1 FROM table1)

会很老套而且效率很低。假设该表有超过 50k 行。

【问题讨论】:

  • 我知道这不是问题,但我不得不问:你只是想获取所有行吗?如果是这样,只需去掉“WHERE col1 IN ({SUBS})”部分即可。
  • 有人告诉我一次 - 没有愚蠢的问题......
  • 听起来好像有人在给我构建动态 sql...
  • "...效率会非常低。考虑表有超过 50k 行。"你说你想检索所有 50k 行。我认为效率有点争议。
  • 问题是,SQL 中的identity 相对于semijoin 是什么?一个很好的问题,您可以用上一个问题回答自己!

标签: sql subquery


【解决方案1】:

这样就可以了:

select col1 from table1

编辑: 似乎有点混乱 - OP 询问可以使用什么值来替换 {SUBS},这将返回来自 table1 的所有行。我上面的答案是您可以使用什么来代替 {SUBS} 来返回所有行。

【讨论】:

  • 你的意思是从table1中选择*
  • 不,我的意思是select col1 from table1 :)
  • 我认为 viligant 正在尝试找出是否有人可以使用 SQL 注入来查找表中的所有数据,而 Andrew 的回复将允许这样做,尽管我可能会使用 SELECT distinct col1 FROM table1 但他的回答是适当的
  • 从发布的问题来看,警惕性似乎试图获得完整的行,而不仅仅是 col1。
  • @pstanton, @Donnie DeBoer:答案只是替换 .. IN (...) 的部分
【解决方案2】:

这在 SQL Server 中适用于我:

SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN (COLUMN_NAME)

您是否尝试过仅将 COL1 用于 {SUBS}

例如

SELECT * FROM table1 WHERE col1 IN (col1)

【讨论】:

    【解决方案3】:

    如果您将{SUBS} 替换为SELECT col1 FROM table1,您最终会得到

    SELECT * FROM table1 WHERE col1 IN (SELECT col1 FROM table1);
    

    这将返回来自table1 的所有行。当然,这只是一种更迂回的说法:

    SELECT * FROM table1;
    

    【讨论】:

      【解决方案4】:

      你是对的,

      SELECT * FROM table1 WHERE col1 IN (SELECT col1 FROM table1)
      

      确实有效,但效率极低;需要合并连接才能返回所有行。

      使用以下与常规SELECT * FROM table1 一样高效

      SELECT * FROM table1 WHERE col1 IN (col1)
      

      但是,话虽如此;我建议您与试图强加SELECT * FROM table1 WHERE col1 IN ({SUBS}) 结构的人聊天。没有好的理由这样做。

      • 它不必要地使查询复杂化。
      • 造成查询效率极低的风险。
      • 甚至可能限制开发人员使用某些技术。

      我怀疑实施此操作的人正在尝试实施某种 silver-bullet 框架。请记住,软件开发中的黄金法则没有 银弹

      【讨论】:

        【解决方案5】:

        如果您只是想检索表中的每一行,那么:

        select * from table1
        

        如果您想证明自己的观点或赢得赌注等,那么:

        select * from table1 where col1 in (select col1 from table1)
        

        【讨论】:

          【解决方案6】:

          如果查询需要一些 WHERE 条件,那么我会尝试用 EXISTS 语句替换它:

          选择
            *
          从
            表 1 t1
          在哪里
            存在({subs})

          然后 {subs} 可以替换为任何不产生 NULL 的表达式。

          【讨论】:

            【解决方案7】:

            这适用于 Oracle:

            select * from table1 where col1 in (col1)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-10-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多