string_to_array函数

我们有时候会有这么一个需求,把多个字符串存到一个数据库字段中,并且以,的方法隔开

当我们连接数据库取这个字段出来做处理可以有两种方式:

  • 通过JAVA中的字符串转数组Split()方法
// An highlighted block
public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str = "0,12,3";
		String arr[] = str.split("//,");  //以,为分割点依次向不同的数组下标里存放数据,逗号不会被存到数组里,0存到arr[0],12存到arr[1],3存到arr[2]
		String arr[] = str.split("");//将字符串中所有字符都存到数组里,0,12,3代表一个元素,存到arr[0]中
		System.out.println(Arrays.toString(arr));  //[0, 12, 3]
		注意这里输出的是元素在数组中的存储结果,逗号代表分割,不是元素
	}
}
  • 这里重点讲的一种方法,通过PostgreSQL支持的 string_to_array函数
select code from ods.my_table t  where id=374;

当我查询出来的结构集为: 1,2,3

//但是我有需要把他们拆分成一个数组进行处理,可以通过 string_to_array函数
select string_to_array(code,’,’) from ods.my_table t where id=374;

结果集为:{1,2,3}

结论

第一个参数为需要转换的字符串
第二个参数为字符串中每个数组的值的分隔符

ANY运算符

要检查一个数组中是否至少存在一个满足条件的值,请按下面的语法使用 ANY 运算符:

comparison_operator ANY (array)

value = ANY (array): 只要数组中有一个等于 value 的值,该表达式返回 true, 否则返回 false。
value > ANY (array): 只要数组中有一个小于 value 的值,该表达式返回 true, 否则返回 false。
value < ANY (array): 只要数组中有一个大于 value 的值,该表达式返回 true, 否则返回 false。
value <> ANY (array): 只要数组中有一个不等于 value 的值,该表达式返回 true, 否则返回 false。

实例
要检查数组 [1, 2, 3] 是否包含一个值为 2 的元素,请使用以下语句:

SELECT 2 = ANY(ARRAY[1, 2, 3]);

结果集为:
?column?
----------
t

要检查数组 [1, 2, 3] 是否包含一个值大于 3 的元素,请使用以下语句:

SELECT 3 < ANY(ARRAY[1, 2, 3]);

结果集为:
?column?
----------
f

string_to_array函数和ANY一起使用

当我们有这样的需求: 查看一个字段中包含的某个字符串,如果包含的就返回改对应 id数据;
当然,我们可以使用like,但是那太影响性能了;这时候如果改字段是上面说的1,2,3的通过,号拼接的字段属性,我们就可以使用string_to_array

//查询t_road_workorder_info表,先把改字段转成一个数组,然后使用ANY运算符
//只要改字段包含一个1,就返回true,当where条件为true的时候,该id字段就会查询出来了;
SELECT  id FROM t_road_workorder_info WHERE '1' = any(string_to_array(code,','));

结论

PostgreSQL ANY 运算符用于将一个值与一个值列表进行比较,只要值列表中有一个值满足指定的条件就返回真,否则返回假。 ANY 运算符可用于 WHERE 子句中过滤指定条件行。