首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Postgresql中使用交叉表准备语句

如何在Postgresql中使用交叉表准备语句
EN

Stack Overflow用户
提问于 2016-08-30 00:26:28
回答 1查看 350关注 0票数 3

使用Symfony (2.8)和Doctrine,以及Postgresql (9.5)。我需要在crosstab中使用预准备语句来透视我的结果。

我的模式是不同的和复杂的,为了简单起见,我们直接从Postgresql的documentation中取一个示例表

代码语言:javascript
复制
CREATE TABLES sales(year int, month int, qty int);
INSERT INTO sales VALUES(2007, 1, 1000);
INSERT INTO sales VALUES(2007, 2, 1500);
INSERT INTO sales VALUES(2007, 7, 500);
INSERT INTO sales VALUES(2007, 11, 1500);
INSERT INTO sales VALUES(2007, 12, 2000);
INSERT INTO sales VALUES(2008, 1, 1000);

现在,下面是PHP代码:

代码语言:javascript
复制
$sql = "SELECT * from CROSSTAB(
    'SELECT year, month, qty FROM sales WHERE year = :year',
    'SELECT m FROM generate_series(1,12) m'
  ) as (
    year int,
    \"Jan\" int,
    \"Feb\" int,
    \"Mar\" int,
    \"Apr\" int,
    \"May\" int,
    \"Jun\" int,
    \"Jul\" int,
    \"Aug\" int,
    \"Sep\" int,
    \"Oct\" int,
    \"Nov\" int,
    \"Dec\" int
  );";

    $statement = $conn->prepare($sql);
    $params = ['year' => 2008];

    $statement->execute($params);

执行此操作将抛出一个错误:

代码语言:javascript
复制
SQLSTATE[HY093]: Invalid parameter number: :year

我认为这可能是因为:year被认为是字符串文字的一部分,因此无法绑定它。我该怎么做呢?有解决办法吗?

EN

回答 1

Stack Overflow用户

发布于 2016-08-30 00:28:55

你是对的。带引号的占位符不是占位符。它们只是字符串的一部分,看起来只是占位符。改为以片段形式构建字符串文字:

代码语言:javascript
复制
$sql = "select * from crosstab(
    'select year, month, qty from sales order by 1 where year = ' + :year,
                                                                ^^^^^^^^^
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39210892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档