mysql【case when,IF,locate,substring_index】函数处理拆分数据

SQL数据处理技巧
本文介绍了一种使用SQL处理数据的方法,通过CASE WHEN ELSE END及IF函数去除数据别名,展示真实数据,适用于需要精确数据展示的场景。

承接上篇博客,如果想要数据更加的完美,可以这样去处理。入口

思想:将前面带的别名去掉,仅展示真实的数据,如果数据没有别名直接展示不需要再去处理。

CASE WHEN ELSE END方式处理数据(推荐):

SELECT
	t.targetColumn,
	CASE
WHEN locate(
	'.',
	substring_index(
		substring_index(
			t.sourceColumn,
			'/',
			b.help_topic_id + 1
		),
		'/' ,- 1
	)
) > 0 THEN
	substring_index(
		substring_index(
			substring_index(
				t.sourceColumn,
				'/',
				b.help_topic_id + 1
			),
			'/' ,- 1
		),
		'.' ,- 1
	)
ELSE
	substring_index(
		substring_index(
			t.sourceColumn,
			'/',
			b.help_topic_id + 1
		),
		'/' ,- 1
	)
END AS sourceColumn
FROM
	syjxdata t
JOIN mysql.help_topic b ON b.help_topic_id < (
	length(t.sourceColumn) - length(
		REPLACE (t.sourceColumn, '/', '')
	) + 1
)
WHERE
	1 = 1
AND t.sourcetable IS NOT NULL
AND t.sourcesystem IS NOT NULL
AND t.sourceColumn IS NOT NULL
AND t.sourceColumn <> ''
ORDER BY
	t.targetColumn

IF(str,true,false)函数处理方式(短语句推荐)


SELECT
	t.targetColumn,

IF (
	locate(
		'.',
		substring_index(
			substring_index(
				t.sourceColumn,
				'/',
				b.help_topic_id + 1
			),
			'/' ,- 1
		)
	) > 0,
	substring_index(
		substring_index(
			substring_index(
				t.sourceColumn,
				'/',
				b.help_topic_id + 1
			),
			'/' ,- 1
		),
		'.' ,- 1
	),
	substring_index(
		substring_index(
			t.sourceColumn,
			'/',
			b.help_topic_id + 1
		),
		'/' ,- 1
	)
)
FROM
	syjxdata t
JOIN mysql.help_topic b ON b.help_topic_id < (
	length(t.sourceColumn) - length(
		REPLACE (t.sourceColumn, '/', '')
	) + 1
)
WHERE
	1 = 1
AND t.sourcetable IS NOT NULL
AND t.sourcesystem IS NOT NULL
AND t.sourceColumn IS NOT NULL
AND t.sourceColumn <> ''
ORDER BY
	t.targetColumn

结果
在这里插入图片描述

# Write your MySQL query statement below WITH RECURSIVE cte_split AS ( -- 初始分割文本,将每个单词逐一提取 SELECT content_id, content_text AS original_text, TRIM(SUBSTRING_INDEX(content_text, ' ', 1)) AS word, TRIM(SUBSTRING(content_text, LENGTH(SUBSTRING_INDEX(content_text, ' ', 1)) + 2)) AS remaining_text, 1 AS word_order -- 跟踪单词的顺序 FROM user_content UNION ALL -- 递归分割剩余文本中的单词 SELECT content_id, original_text, TRIM(SUBSTRING_INDEX(remaining_text, ' ', 1)) AS word, TRIM(SUBSTRING(remaining_text, LENGTH(SUBSTRING_INDEX(remaining_text, ' ', 1)) + 2)) AS remaining_text, word_order + 1 -- 更新单词顺序 FROM cte_split WHERE remaining_text <> '' ), cte_transformed AS ( -- 对每个单词进行转换,包括处理连字符的情况 SELECT content_id, original_text, word_order, CASE -- 如果单词包含连字符,则分割并分别大写两部分 WHEN LOCATE('-', word) > 0 THEN CONCAT( UPPER(SUBSTRING(word, 1, 1)), LOWER(SUBSTRING(word, 2, LOCATE('-', word) - 2)), '-', UPPER(SUBSTRING(word, LOCATE('-', word) + 1, 1)), LOWER(SUBSTRING(word, LOCATE('-', word) + 2)) ) ELSE -- 如果单词没有连字符,直接首字母大写 CONCAT( UPPER(SUBSTRING(word, 1, 1)), LOWER(SUBSTRING(word, 2)) ) END AS transformed_word FROM cte_split ), cte_reconstructed AS ( -- 重建文本,将转换后的单词重新组合 SELECT content_id, original_text, GROUP_CONCAT(transformed_word ORDER BY word_order SEPARATOR ' ') AS converted_text FROM cte_transformed GROUP BY content_id, original_text ) -- 输出结果 SELECT content_id, original_text, converted_text FROM cte_reconstructed 帮我就是这段代码
最新发布
11-20
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT_Octopus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值