【LeetCode-SQL专项突破】-第3天:字符串处理函数/正则

简介: 【LeetCode-SQL专项突破】-第3天:字符串处理函数/正则

b33aae47c47c4becb6fe0302f86efba9.png

1667. 修复表中的名字

9b4617abaecf44ac9bd0cae13eb4beb4.png

🚀 表: Users
+----------------+---------+
| Column Name    | Type    |
+----------------+---------+
| user_id        | int     |
| name           | varchar |
+----------------+---------+
user_id 是该表的主键。
该表包含用户的 ID 和名字。名字仅由小写和大写字符组成。
🚀 需求
编写一个 SQL 查询来修复名字,使得只有第一个字符是大写的,其余都是小写的。
返回按 user_id 排序的结果表。
查询结果格式示例如下。
示例 1:
输入:
Users table:
+---------+-------+
| user_id | name  |
+---------+-------+
| 1       | aLice |
| 2       | bOB   |
+---------+-------+
输出:
+---------+-------+
| user_id | name  |
+---------+-------+
| 1       | Alice |
| 2       | Bob   |
+---------+-------+
🐴🐴 答案
# Write your MySQL query statement below
select user_id,
concat(upper(left(name,1)),lower(substr(name,2))) name
from Users
order by user_id
/* Write your T-SQL query statement below */
select user_id,
UPPER(substring(name,1,1))+LOWER(substring(name,2,len(name)-1)) name
from Users
order by user_id
/* Write your PL/SQL query statement below */
select user_id "user_id",
initcap(name) "name"
from Users
order by 1


9b4617abaecf44ac9bd0cae13eb4beb4.png

1484. 按日期分组销售产品

1d925d97b04147d0a7881a0c6dbf80d6.png

🚀表 Activities:
+-------------+---------+
| 列名         | 类型    |
+-------------+---------+
| sell_date   | date    |
| product     | varchar |
+-------------+---------+
此表没有主键,它可能包含重复项。
此表的每一行都包含产品名称和在市场上销售的日期。
🚀 需求
编写一个 SQL 查询来查找每个日期、销售的不同产品的数量及其名称。
每个日期的销售产品名称应按词典序排列。
返回按 sell_date 排序的结果表。
查询结果格式如下例所示。
示例 1:
输入:
Activities 表:
+------------+-------------+
| sell_date  | product     |
+------------+-------------+
| 2020-05-30 | Headphone   |
| 2020-06-01 | Pencil      |
| 2020-06-02 | Mask        |
| 2020-05-30 | Basketball  |
| 2020-06-01 | Bible       |
| 2020-06-02 | Mask        |
| 2020-05-30 | T-Shirt     |
+------------+-------------+
输出:
+------------+----------+------------------------------+
| sell_date  | num_sold | products                     |
+------------+----------+------------------------------+
| 2020-05-30 | 3        | Basketball,Headphone,T-shirt |
| 2020-06-01 | 2        | Bible,Pencil                 |
| 2020-06-02 | 1        | Mask                         |
+------------+----------+------------------------------+
解释:
对于2020-05-30,出售的物品是 (Headphone, Basketball, T-shirt),按词典序排列,并用逗号 ',' 分隔。
对于2020-06-01,出售的物品是 (Pencil, Bible),按词典序排列,并用逗号分隔。
对于2020-06-02,出售的物品是 (Mask),只需返回该物品名。
🐴🐴 答案
# Write your MySQL query statement below
select 
    sell_date,
    count(distinct product) as num_sold,
    group_concat(distinct product) as products
from Activities
group by sell_date
/* Write your T-SQL query statement below */
SELECT STUFF((SELECT ','+product FROM Activities for xml path('')),1,1,'') 
/* Write your T-SQL query statement below */
select 
sell_date,
count(distinct product) as num_sold,
stuff((select distinct ','+product from Activities a 
where a.sell_date=b.sell_date for xml path('')),1,1,'') AS products 
from Activities b group by sell_date
/* Write your PL/SQL query statement below */
select 
    sell_date "sell_date",
    count(distinct product) as "num_sold",
    wm_concat(distinct product) as "products"
from Activities
group by sell_date


1d925d97b04147d0a7881a0c6dbf80d6.png

1527. 患某种疾病的患者

00aa1c965f8642cc920f3d498d6dcf9f.png

🚀 患者信息表: Patients
+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| patient_id   | int     |
| patient_name | varchar |
| conditions   | varchar |
+--------------+---------+
patient_id (患者 ID)是该表的主键。
'conditions' (疾病)包含 0 个或以上的疾病代码,以空格分隔。
这个表包含医院中患者的信息。
写一条 SQL 语句,查询患有 I 类糖尿病的患者 ID (patient_id)、患者姓名(patient_name)以及其患有的所有疾病代码(conditions)。
I 类糖尿病的代码总是包含前缀 DIAB1 。
按 任意顺序 返回结果表。
查询结果格式如下示例所示。
🚀 需求
示例 1:
输入:
Patients表:
+------------+--------------+--------------+
| patient_id | patient_name | conditions   |
+------------+--------------+--------------+
| 1          | Daniel       | YFEV COUGH   |
| 2          | Alice        |              |
| 3          | Bob          | DIAB100 MYOP |
| 4          | George       | ACNE DIAB100 |
| 5          | Alain        | DIAB201      |
+------------+--------------+--------------+
输出:
+------------+--------------+--------------+
| patient_id | patient_name | conditions   |
+------------+--------------+--------------+
| 3          | Bob          | DIAB100 MYOP |
| 4          | George       | ACNE DIAB100 | 
+------------+--------------+--------------+
解释:Bob 和 George 都患有代码以 DIAB1 开头的疾病。
🐴🐴 答案
# Write your MySQL query statement below
SELECT 
select * FROM Patients
WHERE conditions REGEXP '^DIAB1|\\sDIAB1'
/* Write your PL/SQL query statement below */
select 
 patient_id "patient_id",
 patient_name "patient_name",
 conditions  "conditions"
 from Patients where regexp_like(conditions,'^DIAB1|\ s*DIAB1')
以下为Oracle的正则表达式
^ 匹配一个字符串的开始。如果与“m” 的match_parameter一起使用,则匹配表达式中任何位置的行的开头。
$ 匹配字符串的结尾。如果与“m” 的match_parameter一起使用,则匹配表达式中任何位置的行的末尾。
* 匹配零个或多个。
+ 匹配一个或多个出现。
? 匹配零次或一次出现。
。 匹配任何字符,除了空。
| 用“OR”来指定多个选项。
[]  用于指定一个匹配列表,您尝试匹配列表中的任何一个字符。
[^] 用于指定一个不匹配的列表,您尝试匹配除列表中的字符以外的任何字符。
()  用于将表达式分组为一个子表达式。
{M} 匹配m次。
{M,}  至少匹配m次。
{M,N} 至少匹配m次,但不多于n次。
\ n n是1到9之间的数字。在遇到\ n之前匹配在()内找到的第n个子表达式。
[..]  匹配一个可以多于一个字符的整理元素。
[:] 匹配字符类。
[==]  匹配等价类。
\ d 匹配一个数字字符。
\ D 匹配一个非数字字符。
\ w 匹配包括下划线的任何单词字符。
\ W 匹配任何非单词字符。
\ s 匹配任何空白字符,包括空格,制表符,换页符等等。
\ S 匹配任何非空白字符。
\A  在换行符之前匹配字符串的开头或匹配字符串的末尾。
\Z  匹配字符串的末尾。
*?  匹配前面的模式零次或多次发生。
+?  匹配前面的模式一个或多个事件。
??  匹配前面的模式零次或一次出现。
{N}?  匹配前面的模式n次。
{N,}? 匹配前面的模式至少n次。
{N,M}?  匹配前面的模式至少n次,但不超过m次。

00aa1c965f8642cc920f3d498d6dcf9f.png

目录
相关文章
|
1月前
|
SQL Oracle 关系型数据库
SQL优化-使用联合索引和函数索引
在一次例行巡检中,发现一条使用 `to_char` 函数将日期转换为字符串的 SQL 语句 CPU 利用率很高。为了优化该语句,首先分析了 where 条件中各列的选择性,并创建了不同类型的索引,包括普通索引、函数索引和虚拟列索引。通过对比不同索引的执行计划,最终确定了使用复合索引(包含函数表达式)能够显著降低查询成本,提高执行效率。
|
1月前
|
SQL 数据库 数据库管理
数据库SQL函数应用技巧与方法
在数据库管理中,SQL函数是处理和分析数据的强大工具
|
1月前
|
SQL 数据库 索引
SQL中COUNT函数结合条件使用的技巧与方法
在SQL查询中,COUNT函数是一个非常常用的聚合函数,用于计算表中满足特定条件的记录数
|
1月前
|
SQL 关系型数据库 MySQL
SQL日期函数
SQL日期函数
|
2月前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
3月前
|
SQL 数据处理 数据库
|
3月前
|
SQL Oracle 关系型数据库
SQL 中的大小写处理函数详解
【8月更文挑战第31天】
138 0
|
SQL 存储 数据库
SQL Server函数与存储过程 计算时间
SQL Server函数与存储过程 计算时间 一、通过一个开始时间、结束时间计算出一个工作日天数(不包含工作日与节假日);   1、函数 --创建函数,参数 @bengrq 开始时间,@endrq 结束时间 create function [dbo].
1784 0
|
SQL 存储 Perl
PL/SQL函数和存储过程
前言 活到老,学到老。 基本概念 --ORACLE 提供可以把PL/SQL 程序存储在数据库中,并可以在任何地方来运行它。这样就叫存储过程或函数。过程和函数统称为PL/SQL子程序,他们是被命名的PL/SQL块,均存储在数据库中,并通过输入、输出参数或输入/输出参数与其调用者交换信息。
1417 0