PostgreSQL 如何计算可变参数中有没有重复参数

PostgreSQL 如何计算可变参数中有没有重复参数。
有一个计算排列组合的算法需求,需要知道参数中是否有重复值。目的是过滤掉重复值。
实现方法很简单,需要创建支持可变参数的函数,如下:

postgres=# CREATE or replace FUNCTION has_dupli_val(VARIADIC arr int[]) RETURNS boolean AS $$
  select count(distinct val)<>count(*) dist_val from unnest($1) t(val) where val is not null;
$$ language sql strict;
CREATE FUNCTION
postgres=# select has_dupli_val(1,2,null,1);
 has_dupli_val
---------------
 t
(1 row)

postgres=# select has_dupli_val(1,2,null,3);
 has_dupli_val
---------------
 f
(1 row)

postgres=# select has_dupli_val(1,2,null,null);
 has_dupli_val
---------------
 f
(1 row)

postgres=# select has_dupli_val(null,null);
 has_dupli_val
---------------
 f
(1 row)

还蛮简单的,用到了聚合判断,可变参数使用variadic 标记的数组来定义。
这个函数可以用来生成排列组合。
例子:

postgres=# create table t(id int);
CREATE TABLE
postgres=# insert into t select generate_series(1,5);;
INSERT 0 5

对1,2,3,4,5这5个值进行排列组合,得出组合结果。
排列组合的可能性有5的阶乘种。即120。

postgres=# select 5!;
 ?column?
----------
      120
(1 row)

得到1,2,3,4,5的排列组合的方法:

postgres=# select t1.id,t2.id,t3.id,t4.id,t5.id from t t1,t t2,t t3,t t4,t t5 where not has_dupli_val(t1.id,t2.id,t3.id,t4.id,t5.id);
 id | id | id | id | id
----+----+----+----+----
  1 |  2 |  3 |  4 |  5
  1 |  2 |  3 |  5 |  4
  1 |  2 |  4 |  3 |  5
  1 |  2 |  4 |  5 |  3
  1 |  2 |  5 |  3 |  4
  1 |  2 |  5 |  4 |  3
  1 |  3 |  2 |  4 |  5
  1 |  3 |  2 |  5 |  4
  1 |  3 |  4 |  2 |  5
  1 |  3 |  4 |  5 |  2
  1 |  3 |  5 |  2 |  4
  1 |  3 |  5 |  4 |  2
  1 |  4 |  2 |  3 |  5
  1 |  4 |  2 |  5 |  3
  1 |  4 |  3 |  2 |  5
  1 |  4 |  3 |  5 |  2
  1 |  4 |  5 |  2 |  3
  1 |  4 |  5 |  3 |  2
  1 |  5 |  2 |  3 |  4
  1 |  5 |  2 |  4 |  3
  1 |  5 |  3 |  2 |  4
  1 |  5 |  3 |  4 |  2
  1 |  5 |  4 |  2 |  3
  1 |  5 |  4 |  3 |  2
  2 |  1 |  3 |  4 |  5
  2 |  1 |  3 |  5 |  4
  2 |  1 |  4 |  3 |  5
  2 |  1 |  4 |  5 |  3
  2 |  1 |  5 |  3 |  4
  2 |  1 |  5 |  4 |  3
  2 |  3 |  1 |  4 |  5
  2 |  3 |  1 |  5 |  4
  2 |  3 |  4 |  1 |  5
  2 |  3 |  4 |  5 |  1
  2 |  3 |  5 |  1 |  4
  2 |  3 |  5 |  4 |  1
  2 |  4 |  1 |  3 |  5
  2 |  4 |  1 |  5 |  3
  2 |  4 |  3 |  1 |  5
  2 |  4 |  3 |  5 |  1
  2 |  4 |  5 |  1 |  3
  2 |  4 |  5 |  3 |  1
  2 |  5 |  1 |  3 |  4
  2 |  5 |  1 |  4 |  3
  2 |  5 |  3 |  1 |  4
  2 |  5 |  3 |  4 |  1
  2 |  5 |  4 |  1 |  3
  2 |  5 |  4 |  3 |  1
  3 |  1 |  2 |  4 |  5
  3 |  1 |  2 |  5 |  4
  3 |  1 |  4 |  2 |  5
  3 |  1 |  4 |  5 |  2
  3 |  1 |  5 |  2 |  4
  3 |  1 |  5 |  4 |  2
  3 |  2 |  1 |  4 |  5
  3 |  2 |  1 |  5 |  4
  3 |  2 |  4 |  1 |  5
  3 |  2 |  4 |  5 |  1
  3 |  2 |  5 |  1 |  4
  3 |  2 |  5 |  4 |  1
  3 |  4 |  1 |  2 |  5
  3 |  4 |  1 |  5 |  2
  3 |  4 |  2 |  1 |  5
  3 |  4 |  2 |  5 |  1
  3 |  4 |  5 |  1 |  2
  3 |  4 |  5 |  2 |  1
  3 |  5 |  1 |  2 |  4
  3 |  5 |  1 |  4 |  2
  3 |  5 |  2 |  1 |  4
  3 |  5 |  2 |  4 |  1
  3 |  5 |  4 |  1 |  2
  3 |  5 |  4 |  2 |  1
  4 |  1 |  2 |  3 |  5
  4 |  1 |  2 |  5 |  3
  4 |  1 |  3 |  2 |  5
  4 |  1 |  3 |  5 |  2
  4 |  1 |  5 |  2 |  3
  4 |  1 |  5 |  3 |  2
  4 |  2 |  1 |  3 |  5
  4 |  2 |  1 |  5 |  3
  4 |  2 |  3 |  1 |  5
  4 |  2 |  3 |  5 |  1
  4 |  2 |  5 |  1 |  3
  4 |  2 |  5 |  3 |  1
  4 |  3 |  1 |  2 |  5
  4 |  3 |  1 |  5 |  2
  4 |  3 |  2 |  1 |  5
  4 |  3 |  2 |  5 |  1
  4 |  3 |  5 |  1 |  2
  4 |  3 |  5 |  2 |  1
  4 |  5 |  1 |  2 |  3
  4 |  5 |  1 |  3 |  2
  4 |  5 |  2 |  1 |  3
  4 |  5 |  2 |  3 |  1
  4 |  5 |  3 |  1 |  2
  4 |  5 |  3 |  2 |  1
  5 |  1 |  2 |  3 |  4
  5 |  1 |  2 |  4 |  3
  5 |  1 |  3 |  2 |  4
  5 |  1 |  3 |  4 |  2
  5 |  1 |  4 |  2 |  3
  5 |  1 |  4 |  3 |  2
  5 |  2 |  1 |  3 |  4
  5 |  2 |  1 |  4 |  3
  5 |  2 |  3 |  1 |  4
  5 |  2 |  3 |  4 |  1
  5 |  2 |  4 |  1 |  3
  5 |  2 |  4 |  3 |  1
  5 |  3 |  1 |  2 |  4
  5 |  3 |  1 |  4 |  2
  5 |  3 |  2 |  1 |  4
  5 |  3 |  2 |  4 |  1
  5 |  3 |  4 |  1 |  2
  5 |  3 |  4 |  2 |  1
  5 |  4 |  1 |  2 |  3
  5 |  4 |  1 |  3 |  2
  5 |  4 |  2 |  1 |  3
  5 |  4 |  2 |  3 |  1
  5 |  4 |  3 |  1 |  2
  5 |  4 |  3 |  2 |  1
(120 rows)
时间: 2025-01-27 03:15:49

PostgreSQL 如何计算可变参数中有没有重复参数的相关文章

Scala允许的重复参数

Scala允许你指明函数的最后一个参数可以是重复的.这可以允许客户向函数传入可变长度参数列表 .想要标注一个重复参数,在参数的类型之后放一个星号.例如: scala> def echo (args: String*) = for (arg < - args) println(arg) echo: (String*)Unit 这样定义,echo可以被零个至多个String参数调用: scala> echo() scala> echo("one") one scal

Python中的关键字参数与非关键字参数(可变参数)详解

学过php或者其他语言的同学都知道,php里面的参数不是个数不是可变的(只是很多时候是可以省略的,因为在函数定义的时候为参数设置了默认值).但是在python里却不是这样,python里面运行可变参数的出现,参数中出现(*arg,**arg2)的形式. 今天我们来详解一下这种用法: 例如: def foo1(arg1,arg2,key1=1,key2=2,*arg,**keywords): print "arg1 parameters is ",arg1 print "arg

Go语言的可变(不定长)参数函数

一般情况一个函数的传入参数都是固定的,但是有一些函数能传入不定数量的参数(可变长的).比如c语言中的printf.可以看:<C语言"-"占位符及可变参数函数> 在Go语言中,也有这样的函数.用法类似,也是三个点. 可变参数函数声明: 1 // 这个函数可以传入任意数量的整型参数 2 func sum(nums ...int) { 3     fmt.Println(nums) 4     total := 0 5     for _, num := range nums {

c++把ostream引用放在函数参数中有什么用

问题描述 c++把ostream引用放在函数参数中有什么用 以下代码:void print(ostream& out) const { out << name << salary << endl; } 为什么不直接cout呢,而要传一个ostream引用进来? 解决方案 cout是标准输出iostream的一个对象,用ostream这样不仅仅可以标准输出iostream对象,也可以是文件输出类ofstream 或者ostringstream的一个对象! 解决方案

cxf restful 参数中有map,调用报错,如何处理(不能二次封装map),请大神帮解一下

问题描述 cxf restful 参数中有map,调用报错,如何处理(不能二次封装map),请大神帮解一下 service代码: @GET @Path("/map") @Produces({"application/json","application/xml"}) public String mapTest(@QueryParam("map")Map map){ return "a"; } 调用代码: M

接口-请求参数中有btye[]的文件 怎么用HttpWebRequest去请求

问题描述 请求参数中有btye[]的文件 怎么用HttpWebRequest去请求 求大神指教 我做了个接口,别人调用了我的接口后 Stream stream = Request.Files["img"].InputStream; byte[] bytes = new byte[stream.Length]; stream.Read(bytes, 0, bytes.Length); stream.Seek(0, SeekOrigin.Begin); 我从Request中取到了他上传的文

spring mvc-Spring MVC 请求参数中有%号,报400错误

问题描述 Spring MVC 请求参数中有%号,报400错误 解决方案 地址里面有%,先用urlencode编码下 解决方案二: 先转码一下,然后在后台再转回去 解决方案三: spring mvc 数据绑定 400错误Spring mvc 400错误

URL的参数中有加号传值变为空格的问题(URL特殊字符)_javascript技巧

1.URL特殊字符需转义 2.空格换成加号(+)   3.正斜杠(/)分隔目录和子目录   4.问号(?)分隔URL和查询   5.百分号(%)制定特殊字符   6.#号指定书签   7.&号分隔参数   转义字符的原因: 如果你的表单使用get方法提交,并且提交的参数中有"&"等特殊符的话,如果不做处理,在service端就会将&后面的作为另外一个参数来看待.例如 表单的action为list.jsf?act=Go&state=5 则提交时通过requ

C++11中变参数模版和变参数宏混用的问题

问题描述 C++11中变参数模版和变参数宏混用的问题 定义了一个模版,模版参数定义为可变,想通过宏来实例化,可变的模板参数也通过宏来传递,初步的实现及测试代码如下: #include <QCoreApplication>#include <iostream>// 模板类:template<typename T typename... _Args>struct RuntimeClass{ T* (*m_pfnFunction)(_Args&&... __a