【问题标题】:Oracle - Split the Input string and compare with Column Values [duplicate]Oracle - 拆分输入字符串并与列值进行比较[重复]
【发布时间】:2021-06-18 13:25:05
【问题描述】:

我的数据表如下所示。

该列包含用逗号分隔的数据。

我在存储过程中传递逗号分隔值作为参数。

我想看到如下输出

如果我通过 "Abc,Ple" - 返回的行数将是 1,3,4,5

如果我通过“Abc” - 返回的行数将是 4,5

如果我通过“App” - 返回的行数将是 1,2,5

如何在 Oracle 中完成此任务? 如果我通过 "App,Ple" - 返回的行数将是 1,2,3,4,5

【问题讨论】:

  • 最近几天似乎在各种甲骨文论坛上出现了这种情况。在单个列中使用逗号分隔的值列表是一个基本的设计缺陷。它违反了第一范式,这绝对是关系数据理论的基础。根据数据的实际业务性质,这些以逗号分隔的值应分别位于其自己的列中,或者(更有可能)位于子表的它们自己的行中。当您的表格正确规范化为第三范式时,您的问题就变得微不足道了。
  • 我同意你的观点,它违反了基本的设计缺陷。但是,这是一个非常旧的数据库,不想将数据移动到新表中。但是,逗号分隔的列不会很大。它最多包含 4 或 5 个逗号
  • 你说它是一个旧数据库。它是什么版本?在 Oracle 中有很多不同的方法来标记 CSV 字符串,但在旧版本的产品中选项范围缩小了。

标签: sql string oracle csv


【解决方案1】:

你可以使用:

SELECT *
FROM   table_name t
WHERE  EXISTS (
  WITH input ( value ) AS (
    SELECT 'App' FROM DUAL -- Change this to your input value
  )
  SELECT 1
  FROM   input
  WHERE  ','||t.name||',' LIKE '%,' || REGEXP_SUBSTR( value, '[^,]+', 1, LEVEL ) || ',%'
  CONNECT BY LEVEL <= REGEXP_COUNT( value, '[^,]+' )
)

其中,对于样本数据:

CREATE TABLE table_name ( id, name ) AS
SELECT 1, 'App,Ple' FROM DUAL UNION ALL
SELECT 2, 'App' FROM DUAL UNION ALL
SELECT 3, 'Ple' FROM DUAL UNION ALL
SELECT 4, 'Ple,Abc' FROM DUAL UNION ALL
SELECT 5, 'Abc,Ple' FROM DUAL;

输出:

身份证 |姓名 -: | :------ 1 |应用程序 2 |应用程序

db小提琴here

【讨论】:

    【解决方案2】:

    如果你使用逗号,你可以“作弊”。

    例如,当只搜索一个值时,确保每个项目,包括第一个和最后一个,前后都有一个逗号...

    • ',App,Ple,' LIKE '%,App,%'

    这给了...

    SELECT
      *
    FROM
      yourTable
    WHERE
      ',' || Name || ',' LIKE '%,App,%'
    

    然后你可以更进一步使用regexp_like()来匹配几个项目之一......

    • regexp_like(',App,Ple,', ',Foo,|,App,|,Bar,')

    这给了...

    SELECT
      *
    FROM
      yourTable
    WHERE
      regexp_like(
        ',' || Name || ',',
        ',' || replace('App,Ple', ',', ',|,') || ','
      )
    

    (请原谅错别字,我是在手机上写的)

    利用@MT0 fiddle...https://dbfiddle.uk/?rdbms=oracle_18&fiddle=291567f2a9df3b409126a5ae7b3c5441

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-10
      • 2023-03-10
      • 2021-07-10
      • 2015-08-14
      • 2020-12-09
      • 2016-03-12
      • 1970-01-01
      • 2011-10-19
      相关资源
      最近更新 更多