代码之家  ›  专栏  ›  技术社区  ›  Alastair Pitts

SQL占位符在WHERE-in-issue中,插入的字符串失败

sql
  •  4
  • Alastair Pitts  · 技术社区  · 16 年前

    数组 标签(基本上是主键),但这些必须作为字符串插入。

    由于这将是一个模块化的查询,并用于多个标记,因此将使用占位符。

    查询依赖于WHERE IN语句的使用,即占位符所在的位置,如下所示:

    SELECT SUM(value * 5/1000) as "Hourly Flow [kL]" 
      FROM piarchive..pitotal 
     WHERE tag IN (?) 
       AND time between ? and ? 
       AND timestep = '1d' 
       AND calcbasis = 'Eventweighted' 
       AND value <> ''
    

    '000000012','00000032','005050236','4560236' 查询如下所示:

    SELECT SUM(value * 5/1000) as "Hourly Flow [kL]" 
      FROM piarchive..pitotal 
     WHERE tag IN ('000000012','00000032','005050236','4560236') 
       AND time between ? and ? 
       AND timestep = '1d' 
       AND calcbasis = 'Eventweighted' 
       AND value <> '' 
    

    ……这很管用。

    如果我尝试将相同的标记添加到占位符中,查询将失败。如果我只添加1个标记,不加引号(使用占位符),查询就可以工作。

    为什么会这样?它周围有什么东西吗?

    3 回复  |  直到 16 年前
        1
  •  1
  •   Michael Todd    16 年前

    当您尝试将所有数字放入占位符时,占位符将被视为单个字符串,而不是逗号分隔的项目列表。因此,除非您的表中恰好有一个值与该“字符串”完全匹配,否则它永远不会工作。

    解决方案是使用占位符 需要匹配的项(例如三个项、三个占位符),或者, 不要

        2
  •  1
  •   paxdiablo    16 年前

    我以前在我们的报告解决方案中遇到过这个问题,用户希望能够在独立的下拉控件中输入最多5个值。这些控件填充了可能的值和一个表示“不使用”的NULL值(第一个控件不允许NULL,因为您有top select

    我们的查询包含以下片段(根据您的情况翻译):

    WHERE tag IN (?,?,?,?,?)
    

    然后,当我们设置占位符时,我们将下拉列表中的值分配给它们各自的占位符,但有一个限制条件:如果下拉列表包含NULL,则用第一个下拉列表的内容填充占位符。

    那样的话,如果你进去的话 7,3,1,8,9

    WHERE tag IN (7,3,1,8,9)
    

    7,NULL,1,NULL,9 ,您将得到:

    WHERE tag IN (7,7,1,7,9)
    

    等等我们使用的数据库管理系统足够聪明,可以崩溃 IN 在执行语句之前,将语句转换为最有效的形式,这样做没有真正的惩罚。您的里程数可能会有所不同。

    这种混乱的一个问题是,您必须为数据库中可能的条目数设置一个上限 在里面 但在我们的情况下这不是问题。

        3
  •  1
  •   Tom H zenazn    16 年前

    我们询问了供应商,得到了这个答复,它允许我们传递一组逗号分隔的标签。

    select *
    from pitotal
    where tag IN (SELECT tag from pipoint WHERE INSTR(?, tag) <> 0) and time between 'y' and 't'
    

    基本上是做一堆字符串比较。

    希望这对别人有用