Oracle/MySQL 从dual/help_topic中获取多行数据

Oracle 同时被 2 个专栏收录
2 篇文章 0 订阅
3 篇文章 0 订阅

背景与意义:某学长写出了一段又臭又长的代码,引发了我的思考

获取12个月的月份:

month
1
2
3
4
5
6
7
8
9
10
11
12

正常操作:

SELECT MONTH 
FROM
  (
  SELECT
    1 MONTH UNION ALL
  SELECT
    2 MONTH UNION ALL
  SELECT
    3 MONTH UNION ALL
  SELECT
    4 MONTH UNION ALL
  SELECT
    5 MONTH UNION ALL
  SELECT
    6 MONTH UNION ALL
  SELECT
    7 MONTH UNION ALL
  SELECT
    8 MONTH UNION ALL
  SELECT
    9 MONTH UNION ALL
  SELECT
    10 MONTH UNION ALL
  SELECT
    11 MONTH UNION ALL
  SELECT
  12 MONTH 
  ) months;

因为实在是太长了,希望能简短一点,因此调用MySQL的help_topic进行改写:

MySQL版本

SELECT
	substring_index( substring_index( m_str, m_split, help_topic_id + 1 ), m_split,- 1 ) AS MONTH 
FROM
	mysql.help_topic,
	( SELECT '1,2,3,4,5,6,7,8,9,10,11,12' AS m_str, ',' AS m_split FROM DUAL ) AS m_tbl 
WHERE
	help_topic_id < ( length( m_tbl.m_str ) - length( REPLACE ( m_tbl.m_str, m_split, '' )) + 1 );

使用了拆分字符串的思想,其中m_str就是每行需要显示的数值,m_split 是分隔符。

输出结果

在这里插入图片描述

Oracle版:

SELECT
	ROWNUM MONTH 
FROM
	DUAL CONNECT BY LEVEL <= 12;

Oracle输出结果

在这里插入图片描述

  • 0
    点赞
  • 2
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

雲帝

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值