SQL,用case when写,当一个混合字符串中包含一个连续的18位数字则输出这个18位数字,没有的话输出无数据
时间: 2024-10-23 15:20:01 浏览: 30
在SQL中,你可以使用`CASE`语句和`LIKE`或者正则表达式来实现这个需求。这里是一个例子,假设我们有一个名为`your_column`的列:
```sql
SELECT
CASE
WHEN `your_column` SIMILAR TO '%[0-9]{18}%'
THEN `your_column`
ELSE '无数据'
END AS eighteen_digit_result
FROM your_table
```
在这个查询中,`SIMILAR TO`模式匹配会查找字符串中是否有连续的18个数字。如果有,则返回原字符串;如果没有,则返回'无数据'。
如果你的数据库不支持`SIMILAR TO`,可以考虑使用`REGEXP`函数,但这取决于你的数据库版本和对正则表达式的支持程度:
```sql
SELECT
CASE
WHEN REGEXP_LIKE(`your_column`, '\b\d{18}\b')
THEN `your_column`
ELSE '无数据'
END AS eighteen_digit_result
FROM your_table
```
在这个例子中,`\b`代表单词边界,防止匹配到非孤立的数字串。
相关问题
SQL,用case when写,当一个混合字符串中包含一个连续的18位数字则从这个混合部分中截取出这个18位数字,没有的话输出无数据
你可以使用SQL的`CASE`语句配合`LIKE`或者`REGEXP`函数来实现这个需求。假设你的表名为`your_table`,列名是`your_column`,你可以编写这样的查询:
```sql
SELECT
CASE
WHEN your_column LIKE '%\b[0-9]{18}\b%'
THEN SUBSTRING(your_column, INSTR(your_column, '\b[0-9]{18}\b') + LENGTH('\b[0-9]{18}\b') - 1, 18)
ELSE '无数据'
END AS extracted_number
FROM
your_table;
```
这里的关键点是:
- `LIKE '%\b[0-9]{18}\b%'` 检查字符串是否包含连续的18位数字。
- `INSTR()` 函数找到数字序列开始的位置。
- `SUBSTRING()` 函数从找到的位置截取18位数字。
- 如果没有找到,`ELSE`分支返回'无数据'。
请注意,这个查询假设输入的字符串是纯文本,没有额外的特殊字符干扰。如果是更复杂的情况,可能需要进一步调整正则表达式或处理方法。
SQL,用case when写,当一个混合字符串#NOTE_S中包含一个连续的18位数字则从这个混合部分中截取出这个18位数字,没有的话输出无数据
SQL中的CASE WHEN语句可以用来根据特定条件执行不同的操作。为了从混合字符串`#NOTE_S`中提取连续的18位数字,你可以使用类似下面的查询:
```sql
SELECT
CASE
WHEN REGEXP_LIKE(#NOTE_S, '^[0-9]{18}$') THEN SUBSTR(#NOTE_S, INSTR(#NOTE_S, '^[0-9]{18}'), LENGTH('#NOTE_S'))
ELSE '无数据'
END AS ExtractedNumber
FROM your_table;
```
这里做了以下几步:
1. `REGEXP_LIKE(#NOTE_S, '^[0-9]{18}$')`: 使用正则表达式检查`#NOTE_S`是否以18位数字开头并结束。`'^[0-9]{18}'`匹配18位连续的数字,`$`表示字符串结尾。
2. `INSTR(#NOTE_S, '^[0-9]{18}')`: 查找该18位数字在字符串`#NOTE_S`中的开始位置。
3. `SUBSTR(#NOTE_S, ..., LENGTH(#NOTE_S))`: 使用`SUBSTR`函数截取从开始位置到字符串结尾的部分,如果找到18位数字,则返回这部分;如果没有找到,将返回整个字符串。
阅读全文