【问题标题】:Convert String to char in oracle在oracle中将字符串转换为字符
【发布时间】:2021-04-10 18:57:47
【问题描述】:

您好,我有以下数据 '1,2,3',我需要将其转换为我将在其中使用的 '1','2','3'

Select * from dual where to_chat(month) in ('1','2','3')

由于quater,我不能像那样直接使用查询

Quater no.    Month
1             1,2,3
2             4,5,6
...  

所以我必须像这样使用 case 但 case 语句以这样的格式返回 '1','2','3'

 Select * from dual 
where to_chat(month) in (
select 
case quarter 
when 1 then '1','2','3' 
when 2 then '4','5','6' 
end 
from dual )

输入

'1,2,3'

预期输出

'1','2','3'

【问题讨论】:

  • 无论如何,你不能那样做。 IN 子句中的每个值都是一个单独的项目。看看这个 - stackoverflow.com/questions/4672545/…
  • 什么是to_chat?你的意思是 to_char 吗?
  • 在任何情况下,MONTH 和 QUARTER 都应该是数字,那么为什么要将它们作为字符串处理呢?如果它们都是数字(应该是),并且您想选择“月份与季度匹配的地方”(您似乎想要),那很简单:... where QUARTER = ceil(MONTH/3)
  • 嗨 @marhguy 是的,它是数字,但在桌子上没有 quater 列,所以 QUARTER = 不起作用
  • @KimIvanBay-an 如果表中没有季度列,那么为什么在带有 case 语句的示例代码中包含它?如果您可以添加一些示例数据和所需的结果,那将为这里的每个人消除困惑

标签: sql oracle oracle11g oracle-sqldeveloper


【解决方案1】:

你可以使用regexp_like():

where regexp_like(<whatever>, replace('1,2,3', ',', '|'))

在字符串中添加单引号仍然无法让您使用like 做您想做的事情。它仍然是一个字符串,但其中包含单引号和逗号。

【讨论】:

  • 您能提供完整的查询示例吗?抱歉,我无法理解您的意思,我是 kida 新手
  • 因为如果我使用 replace('1,2,3', ',', '|') 如果我输入 10 replace('10,11,12', ') 会得到 1 ,', '|')
【解决方案2】:

这样的方法怎么样?示例基于 Scott 的 EMP 表。我想获取在特定月份入职的员工。

样本数据:

SQL> select deptno, ename, job, hiredate, to_char(hiredate, 'mm') mon from emp order by mon;

    DEPTNO ENAME      JOB       HIREDATE   MO
---------- ---------- --------- ---------- --
        20 ADAMS      CLERK     12.01.1983 01
        10 MILLER     CLERK     23.01.1982 01
        30 ALLEN      SALESMAN  20.02.1981 02  -- suppose I want to select employees
        30 WARD       SALESMAN  22.02.1981 02  -- hired in February,
        20 JONES      MANAGER   02.04.1981 04  -- April and
        30 BLAKE      MANAGER   01.05.1981 05  -- May
        10 CLARK      MANAGER   09.06.1981 06
        30 TURNER     SALESMAN  08.09.1981 09
        30 MARTIN     SALESMAN  28.09.1981 09
        10 KING       PRESIDENT 17.11.1981 11
        20 SCOTT      ANALYST   09.12.1982 12
        20 SMITH      CLERK     17.12.1980 12
        30 JAMES      CLERK     03.12.1981 12
        20 FORD       ANALYST   03.12.1981 12

14 rows selected.

查询 - 将输入搜索字符串拆分为行(以便您可以在 IN 子句中使用它)然后是:

SQL> with src as
  2    (select &par_month src_month from dual)
  3  select deptno, ename, job, hiredate
  4  from emp
  5  where to_number(to_char(hiredate, 'mm')) in
  6    (select regexp_substr(src_month, '[^,]+', 1, level)
  7     from src
  8     connect by level <= regexp_count(src_month, ',') + 1
  9    )
 10  order by to_char(hiredate, 'mm');
Enter value for par_month: '2,4,5'

    DEPTNO ENAME      JOB       HIREDATE
---------- ---------- --------- ----------
        30 ALLEN      SALESMAN  20.02.1981
        30 WARD       SALESMAN  22.02.1981
        20 JONES      MANAGER   02.04.1981
        30 BLAKE      MANAGER   01.05.1981

SQL>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    相关资源
    最近更新 更多