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 子句中过滤指定条件行。