在此查询中使用SQL的替代方法

在此查询中使用SQL的替代方法,sql,database,oracle,Sql,Database,Oracle,我有一个字符串,其中包含逗号分隔的值=value1、value2、value3 我要执行以下操作: SELECT col FROM table WHERE col IN :values 如果值的条目数少于1000个,则此操作正常。当值包含超过1000个条目时,它会给出错误。IN的使用是有限制的 是否有其他方法执行此查询 编辑: 它是Oracle的Business Intelligence Publisher应用程序。客户/用户可以使用下面的任何数据库 我无法控制数据库。因此,我无法创建临时表或

我有一个字符串,其中包含逗号分隔的值=value1、value2、value3

我要执行以下操作:

SELECT col FROM table WHERE col IN :values
如果值的条目数少于1000个,则此操作正常。当值包含超过1000个条目时,它会给出错误。IN的使用是有限制的

是否有其他方法执行此查询

编辑: 它是Oracle的Business Intelligence Publisher应用程序。客户/用户可以使用下面的任何数据库

我无法控制数据库。因此,我无法创建临时表或存储过程。我所能做的就是从UI屏幕中选择多个值(它形成逗号分隔的字符串),并在SQL查询中使用它。取决于生成的报告

  • 无法将EXISTS与静态字符串值一起使用
  • 无法使用存储过程或临时表

    • 最出色的性能需要一点手工制作。我建议构建一个内存中的临时表,将每个值保存在一行中,然后将实际表连接到这个临时表。这将使您的查询速度大大加快,并且作为额外的好处,临时表中的行数不受限制(或者说,仅受内存限制)。

      您可以将值插入临时表,然后执行联接:

      SELECT col from table t1 JOIN #temp t2 WHERE table.col = t2.col;
      

      创建一个存储过程来为您执行此任务,如下所示:

      Create PROCEDURE [dbo].[spGetData] 
          -- Add the parameters for the stored procedure here
          @ids nvarchar(MAX)
      AS
      BEGIN
          -- SET NOCOUNT ON added to prevent extra result sets from
          -- interfering with SELECT statements.
          SET NOCOUNT ON;
      
      CREATE TABLE #TempTable(col int)
      while len(@ids) > 0
      begin
        insert into #TempTable values (left(@ids, charindex(',', @ids+',')-1))
        set @ids = stuff(@ids, 1, charindex(',', @ids+','), '')
      end
          -- Insert statements for procedure here
          select col from table where col in (select col from #TempTable)
      END 
      

      来源于我的博客:

      多年来,我们一直使用以下函数来分割传递到存储过程中的CSV字符串。(如果这不是最现代、最优雅或最有效的方式,我深表歉意,但它对我们的目的很有效)

      在使用中,它是:

      select value from dbo.fn_Split('string1,string2,string3',',')
      
      (哦,这是针对MS SQL Server数据库的)

      如果无法创建全局临时表,则可以使用sys.dbms\u debug\u vc2coll()将分隔列表转换为行,并加入此集合

      SELECT t.col 
      FROM table t
      JOIN TABLE(SELECT column_value 
                   FROM sys.dbms_debug_vc2coll(:values)) c on t.col = c.column_value;
      

      您的RDBMS是什么?对于Oracle,可以使用游标创建PL SQL函数。虽然这可能是一种过度的杀伤力。只是一个想法…MySQL、Oracle、PostGreSQL、SQL Server?它们都有不同的能力和语法。这是来自您自己的应用程序的查询吗?或者它是在某种查询管理器中完成的?您的值列表是否从另一个表/查询派生?等等,等等,等等?请提供更多详细信息和上下文。您是否绝对确定无法创建临时表?临时表对其他用户没有影响,它们是临时的,并且在会话中是本地的。不能做到这一点是不寻常的。您是否有经验丰富的同事(或手册)可以为您明确说明这一点?谢谢您的回复@尼尔奈特:我已经探索了存在的选择。但是,它需要使用SELECT进行另一个子查询。在我的例子中,我有一系列的值需要研究。谢谢你的回复@PanagiotisPalladinos任何数据库都取决于客户。正如您所看到的,我创建了一个临时表,并在其中添加了所有列,然后获取该临时表中的所有记录,您应该传递一个逗号分隔的数组sumes SQL Server。由于OP使用
      :values
      作为参数,这不太可能是正确的…它是sql,因为它在标记中:),如果传递的参数是cols逗号分隔数组dit是
      sql
      ,它将工作,但这并不意味着它是
      sql Server
      。SQL Server使用
      @param
      ,Oracle使用
      :param
      。Oracle符号的使用使得SQL Server不太可能使用这种符号。另外,在我发表评论之后,在你发表评论之前,OP已经声明这是在Oracle(不是SQL Server)上的。谢谢@jalynn2。我无法控制代码。我所能做的就是从UI屏幕中选择“n”值,并使用这些值编写查询。由于OP使用参数
      :values
      ,假设SQL Server不太可能是正确的…啊,我想知道该语法是什么。哦,好吧,今天有人试图得分。。。
      SELECT t.col 
      FROM table t
      JOIN TABLE(SELECT column_value 
                   FROM sys.dbms_debug_vc2coll(:values)) c on t.col = c.column_value;