Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未标记差异。1)您需要将1替换为a。2) 这将阻止Optimizer使用索引等。它确实会产生一个用于多种目的的查询,但应该针对动态sql检查性能开销。(每个查询只能创建一个计划,但不同的order by子句可能需要不同的计划才能有效。)这是正确的,它根据a_Sql_Database_Postgresql_Dynamic Sql_Plpgsql - Fatal编程技术网

未标记差异。1)您需要将1替换为a。2) 这将阻止Optimizer使用索引等。它确实会产生一个用于多种目的的查询,但应该针对动态sql检查性能开销。(每个查询只能创建一个计划,但不同的order by子句可能需要不同的计划才能有效。)这是正确的,它根据a

未标记差异。1)您需要将1替换为a。2) 这将阻止Optimizer使用索引等。它确实会产生一个用于多种目的的查询,但应该针对动态sql检查性能开销。(每个查询只能创建一个计划,但不同的order by子句可能需要不同的计划才能有效。)这是正确的,它根据a,sql,database,postgresql,dynamic-sql,plpgsql,Sql,Database,Postgresql,Dynamic Sql,Plpgsql,未标记差异。1)您需要将1替换为a。2) 这将阻止Optimizer使用索引等。它确实会产生一个用于多种目的的查询,但应该针对动态sql检查性能开销。(每个查询只能创建一个计划,但不同的order by子句可能需要不同的计划才能有效。)这是正确的,它根据a是否等于“asc”按第一列降序或升序排序。但我还是会编辑,让它更清楚。这是不合法的。表达式中不能有ASC或DESC。@asnyder是的,这是一个无法工作的示例;)非常旧的答案,因此质量还有很多需要改进的地方。为了避免数据类型问题当$2='a'


未标记差异。1)您需要将
1
替换为
a
。2) 这将阻止Optimizer使用索引等。它确实会产生一个用于多种目的的查询,但应该针对动态sql检查性能开销。(每个查询只能创建一个计划,但不同的order by子句可能需要不同的计划才能有效。)这是正确的,它根据a是否等于“asc”按第一列降序或升序排序。但我还是会编辑,让它更清楚。这是不合法的。表达式中不能有ASC或DESC。@asnyder是的,这是一个无法工作的示例;)非常旧的答案,因此质量还有很多需要改进的地方。为了避免数据类型问题<代码>当$2='a'然后是a结束时按案例排序,当$2='b'然后是b结束时按案例排序,等等。但请注意,这与我在soulcheck的回答中提到的优化问题相同。这不是我所指的数据类型问题。显然$2将始终是相同的数据类型。如果列a和列b是不同的数据类型,那么可能会引起一些问题。我给出的示例将每个字段作为单独的子句按顺序排列。CASE语句按null、null、x、null产生
顺序(例如),因此导致数据类型独立性。感谢您的回答和评论。我正在使用Dems版本的
CASE
,但是postgresql抛出:
错误:当我尝试创建函数时,CASE类型字符变化和整数无法匹配(在
之后的位置上,然后
-wird)。我将编辑问题并添加完整的来源…正是我所说的问题。您需要确保将所有结果转换为相同的数据类型。Brandstetter:哇,现在您已经向我学习了一些plpgsql:-)我不知道如何使用
返回查询执行
。这是一个非常优雅的解决方案,我现在不担心plpgsql方法。非常感谢你!如何添加ASC或DESC?@erwin:我想动态添加,就像为orderby添加一样。我想动态地通过升序或降序。@Sachin:问一个有相关细节的新问题。评论不是地方。如果需要上下文,您可以始终链接到此链接。有简单安全的解决方案。请检查此问题。
CREATE OR REPLACE FUNCTION getStuff(param character varying)
  RETURNS SETOF stuff AS
$BODY$
    select *
    from stuff
    where col = $1
$BODY$
  LANGUAGE sql;
select * from getStuff('hello');
select * from getStuff('hello') order by col2 limit 100;
CREATE OR REPLACE FUNCTION getStuff(param character varying, orderby character varying)
  RETURNS SETOF stuff AS
$BODY$
    select t.*
    from stuff t
    where col = $1
    ORDER BY
        CASE WHEN $2 = 'parent' THEN t.parent END,
        CASE WHEN $2 = 'type' THEN t."type" END, 
        CASE WHEN $2 = 'title' THEN t.title END

$BODY$
  LANGUAGE sql;
CREATE TABLE stuff
    (
      id integer serial,
      "type" integer NOT NULL,
      parent integer,
      title character varying(100) NOT NULL,
      description text,
      CONSTRAINT "pkId" PRIMARY KEY (id),
    )
ORDER BY CASE condition_variable
WHEN 'asc' THEN column_name ASC
ELSE column_name DESC
END;
SELECT
    <column list>
FROM
    Stuff
WHERE
    col1 = $1
ORDER BY
    CASE $2
        WHEN 'col1' THEN col1
        WHEN 'col2' THEN col2
        WHEN 'col3' THEN col3
        ELSE col1  -- Or whatever your default should be
    END
SELECT * FROM get_stuff('hello', 'col2', 100);
CREATE OR REPLACE FUNCTION getStuff(param varchar)
RETURNS setof STUFF
LANGUAGE SQL
STABLE
AS $$ ... $$;
CREATE FUNCTION sort_stuff(sort_col TEXT, sort_dir TEXT DEFAULT 'asc')
RETURNS SETOF stuff
LANGUAGE SQL
STABLE
AS $$
    SELECT *
    FROM stuff
    ORDER BY
      -- Simplified to NULL if not sorting in ascending order.
      CASE WHEN sort_dir = 'asc' THEN
          CASE sort_col
              -- Check for each possible value of sort_col.
              WHEN 'col1' THEN col1
              WHEN 'col2' THEN col2
              WHEN 'col3' THEN col3
              --- etc.
              ELSE NULL
          END
      ELSE
          NULL
      END
      ASC,

      -- Same as before, but for sort_dir = 'desc'
      CASE WHEN sort_dir = 'desc' THEN
          CASE sort_col
              WHEN 'col1' THEN col1
              WHEN 'col2' THEN col2
              WHEN 'col3' THEN col3
              ELSE NULL
          END
      ELSE
          NULL
      END
      DESC
$$;
SELECT *
FROM stuff
ORDER BY <sort_col> <sort_dir>