【问题标题】:find string from delimited values from delimited values (Oracle PL-SQL)从分隔值中查找字符串 (Oracle PL-SQL)
【发布时间】:2011-12-31 09:06:51
【问题描述】:

如何为 Oracle 数据库编写查询,以便我可以从包含逗号分隔的值列表的列中找到逗号分隔的值列表。传递给 sql 语句的 :parameter 也是用户选择的逗号分隔值。

例如 我们在表中有一列包含

1 | 'A','B','C'

2 | 'C','A'

3 | 'A','B'

在 Web 应用程序界面上,我们有多选框显示 一种 乙 C 并允许用户选择一项或多项。

如果他们选择 A 和 B,我希望显示第 1 行和第 2 行,如果他们选择 A,则只有所有三个应该显示 b/c 所有第 1 到第 3 行都有“A”值。

【问题讨论】:

  • 表格列中的 CSV 列表表示设计不佳。你能射杀分析师吗?
  • 您提到“在网络应用程序界面上”。 Php、Java、.NET、ruby 可以更轻松地处理这种设计。
  • DCookie,我必须这样做,我今天早上也有同样的感觉 :-)

标签: oracle plsql


【解决方案1】:

您可以使用具有不同数量绑定值的 where 子句,具体取决于所选选项的数量:

TEST@PRJ> create table t (c varchar2(100));
TEST@PRJ> insert into t values ('2 | ''C'',''A''');
TEST@PRJ> insert into t values ('3 | ''A'',''B''');
TEST@PRJ> select * from t where c like '%''A''%' and c like '%''B''%';

C
----------------------------------------------------------------------------------------------------------------
1 | 'A','B','C'
3 | 'A','B'

TEST@PRJ> select * from t where c like '%''A''%';

C
----------------------------------------------------------------------------------------------------------------
1 | 'A','B','C'
2 | 'C','A'
3 | 'A','B'

如果值按顺序存储,您可以使用单个绑定值:

TEST@PRJ> select * from t where c like '%''A''%''B''%';

C
-----------------------------------------------------------------------------------------
1 | 'A','B','C'
3 | 'A','B'

【讨论】:

    【解决方案2】:

    此示例有望有所帮助,它匹配值,无论它们在数据库记录中的字符串中出现的顺序如何。

    创建示例表:

    CREATE TABLE t
    (val VARCHAR2(100));
    

    插入记录:

    INSERT INTO t VALUES
    ('1|''A'',''B'',''C''');
    
    INSERT INTO t VALUES
    ('2|''C'',''A''');
    
    INSERT INTO t VALUES
    ('3|''A'',''B''');
    

    检查值:

    SELECT * FROM t;
    
    1|'A','B','C'
    2|'C','A'    
    3|'A','B'
    

    检查“A”的解决方案:

    SELECT val
      FROM t
     WHERE REGEXP_LIKE(val, '(A)');
    
    1|'A','B','C'   
    2|'C','A'      
    3|'A','B'
    

    检查 A 和 B 的解决方案

    SELECT val
      FROM t
     WHERE REGEXP_LIKE(val, '(A|B).*(A|B)');
    
    1|'A','B','C'
    3|'A','B'
    

    如果您想确保结果的 1| 部分没有与任何内容匹配,那么您可以使用以下命令进行查询:

    SELECT val
      FROM t
     WHERE REGEXP_LIKE(val, '(.\|.*)(A)');
    

    SELECT val
      FROM t
     WHERE REGEXP_LIKE(val, '(.\|.*)(A|B).*(A|B)');
    

    希望这会有所帮助...

    【讨论】:

      猜你喜欢
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 2011-07-27
      • 1970-01-01
      • 2014-10-19
      • 2013-05-01
      • 1970-01-01
      相关资源
      最近更新 更多