SQL提取字符串中,提取“符号:”到“|”之间的部分,如果有满足条件的则输出该部分,用casewhen搭配正则表达式写,没有的话输出无规范表达
时间: 2024-12-19 12:16:12 浏览: 13
在SQL中,可以使用`REGEXP_EXTRACT()`函数结合`CASE`表达式来尝试提取符合正则表达式的字符串部分。假设你要从字符串中提取"符号:"到"|"之间的部分,可以编写如下的查询:
```sql
WITH input_data AS (
SELECT 'example: this is a string with | in it' AS str_column
)
SELECT
CASE
WHEN REGEXP_LIKE(str_column, '(?<=符号:).*?(?=|$|符号:)') THEN REGEXP_EXTRACT(str_column, '(?<=符号:).*?(?=|$|符号:)')
ELSE '无规范表达'
END AS extracted_part
FROM
input_data;
```
这个查询首先检查输入字符串是否包含"符号:"和"|", 如果存在并且它们之间有其他字符,则提取那段字符,否则返回'无规范表达'。
注意,这个例子假设"|"不会作为正则表达式的特殊字符出现。如果不是这样,可能需要对正则表达式做适当的转义处理。
相关问题
有一串字符,组合方式是型号:两位字符的英文、几位字符数字,符号-,几位字符数字,符号|||,,例如型号:gp100-35|||旧设备,用SQL将它只保留型号:后且符号|||前的部分,例如gp100-35,且讲小写英文全部调整为大写,去除中间的符号-,输出例如
在SQL中,处理这种字符串并提取指定部分可以使用一些字符串函数。假设你的表名为`devices`,并且有一个字段`model`存储了这样的型号信息,你可以使用以下查询:
```sql
SELECT REPLACE(
SUBSTRING_INDEX(model, ' ', -2),
'-', '',
CHAR_LENGTH(model) - LENGTH(REPLACE(model, '|', '')) + 3
) AS processed_model
FROM devices
WHERE model LIKE '%-%|%|%'
```
这个查询的工作原理是:
1. `SUBSTRING_INDEX(model, ' ', -2)` 会获取从最后一个空格到字符串结尾的所有内容(即型号部分),去掉最后两个空格。
2. `REPLACE(model, '-', '')` 删除所有'-'字符。
3. `CHAR_LENGTH(model) - LENGTH(...)` 计算剩余符号'|'的数量,因为每个'|'减少一次长度。
4. `+ 3` 补充丢失的'-',因为我们删除了一个'-'。
注意,这个查询假设型号始终以'-'分隔字母和数字,然后以连续的'('|'|'|')结束。如果输入格式稍微变化,可能需要调整正则表达式匹配或替换部分。
SQL函数,字符串str是数字中文英文及标点符号混合,提取出其中18位数字部分
在SQL中,如果你有一个包含数字、中文、英文以及标点符号的字符串`str`,想要提取出其中的18位数字部分,可以使用正则表达式函数。例如,`REGEXP_EXTRACT`或`PATINDEX`函数(如果支持),配合`LIKE`操作符。这里是一个例子:
```sql
SELECT
SUBSTRING(str,
PATINDEX('%[0-9]{18}%', str) + PATINDEX('%[0-9]%', str),
LEN(str)) AS ExtractedDigits
FROM your_table;
```
或者
```sql
SELECT
REGEXP_EXTRACT(str, '(\b\d{18}\b)') AS ExtractedDigits
FROM your_table;
```
这两个查询都会返回第一个发现的18位数字串,如果字符串中存在多个这样的数字段落,它们只会提取第一个。
注意,这取决于具体的数据库系统,因为不是所有的SQL方言都支持`PATINDEX`或`REGEXP_EXTRACT`函数。如果你的系统不支持,可能需要寻找其他可行的解决方案。
阅读全文