PostgreSQL【SQL 01】根据条件更新字段值或追加信息STRPOS(string, substring)函数使用及LIKE函数对比

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: PostgreSQL【SQL 01】根据条件更新字段值或追加信息STRPOS(string, substring)函数使用及LIKE函数对比

1.需求说明

项目中有这样一个需求,根据条件标记数据,需要完成的内容如下:

  1. 对符合条件的数据进行标记;
  2. 无值则使用标记值;
  3. 有值则判断是否包含当前标记,包含则不处理,不包含则追加。

2.SQL编程

话不多说,上SQL:

UPDATE targetTableName 
SET targetField =
CASE    
    WHEN targetField IS NULL THEN #{ targetValue } 
    WHEN STRPOS ( targetField, #{ targetValue } ) = 0 THEN CONCAT ( targetField, ',', #{ targetValue } ) 
    ELSE targetField 
  END 
WHERE
  whereConditionStatement

这里进行一些说明:

  1. 为什么需要判断IS NULL
SELECT STRPOS( NULL, 'g' )
-- 结果是(Null)

如果标记字段为空,使用STRPOS函数就没有返回值,而CASE WHEN需要一个布尔值。

  1. STRPOS函数
SELECT STRPOS( 'abcdefg', 'a' ) 
-- 结果是 1
SELECT STRPOS( 'abcdefg', 'g' ) 
-- 结果是 7
SELECT STRPOS( 'abcdefg', 'h' ) 
-- 结果是 0
  1. ELSE必须要有值

这个是个坑😢如果不写ELSE语句,前两个条件不符合时,标记字段的值将被设置为null

3.总结

话说为什么不用LIKE呢?

SELECT NULL LIKE '%a%'
-- 结果也是 (Null)
SELECT 'abcdefg' LIKE '%a%'
-- 结果是 t

实际上是可以使用的,只不过要对#{targetValue}拼接%

-- 以下为MySQL语法(两种方式都是可以使用到索引的)
SELECT COUNT( 1 ) FROM dataTableName WHERE field LIKE 'str';
SELECT COUNT( 1 ) FROM dataTableName WHERE INSTR(field , '%str%') > 0;
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
8天前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
11天前
|
SQL 数据处理 数据库
|
11天前
|
SQL Oracle 关系型数据库
SQL 中的大小写处理函数详解
【8月更文挑战第31天】
26 0
|
11天前
|
SQL 数据采集 数据挖掘
为什么要使用 SQL 函数?详尽分析
【8月更文挑战第31天】
10 0
|
11天前
|
SQL 存储 关系型数据库
COALESCE 函数:SQL中的空值处理利器
【8月更文挑战第31天】
51 0
|
3月前
|
Java UED
Java中String强转int:一种常见的错误和解决方法
在Java中将非数字字符串转换为整数会导致`NumberFormatException`。要解决这个问题,可以使用`try-catch`捕获异常,正则表达式验证数字格式,或利用异常信息提供错误提示。例如,`Integer.parseInt()`会因遇到非数字字符如`"123abc"`而抛出异常,但通过异常处理或正则`\\d+`可确保安全转换。记得在编程时避免直接强转,以防止程序异常中断。
|
27天前
|
前端开发 Java
成功解决:java.lang.String cannot be cast to java.lang.Integer
这篇文章记录了作者在使用Axios二次封装时遇到的一个Java类型转换问题,即前端传递的字符串参数不能直接转换为Integer类型,文章提供了正确的转换方法来解决这个问题。
成功解决:java.lang.String cannot be cast to java.lang.Integer
|
22天前
|
安全 Java API
Java系类 之 String、StringBuffer和StringBuilder类的区别
这篇文章讨论了Java中`String`、`StringBuffer`和`StringBuilder`三个类的区别,其中`String`是不可变的,而`StringBuffer`是线程安全的可变字符串类,`StringBuilder`是非线程安全的可变字符串类,通常在单线程环境下性能更优。
Java系类 之 String、StringBuffer和StringBuilder类的区别
|
30天前
|
Java Android开发
解决Android编译报错:Unable to make field private final java.lang.String java.io.File.path accessible
解决Android编译报错:Unable to make field private final java.lang.String java.io.File.path accessible
64 1
|
2月前
|
Java
Java中将保留四位小数的Double转换为String的方法详解
选择合适的方法,可以使代码更加简洁、高效,同时也能满足不同场景下的需求。
33 5