【问题标题】:How do you search for a string in a varray in SQL (Oracle)如何在 SQL (Oracle) 中的可变数组中搜索字符串
【发布时间】:2021-06-21 17:19:54
【问题描述】:

如何查询特定字符串的可变数组属性,例如包含号码 013579 或以 0883 开头的电话号码数组?

另外,我如何查询以计算数组中的值的数量(例如,检查 varray 是否包含 3 个值)

【问题讨论】:

    标签: sql oracle count varray


    【解决方案1】:

    如果它是一个集合,那么您可以使用MEMBER OF 运算符来查找一个元素是否包含在一个集合中,或者使用CARDINALITY 函数来检查集合的大小;但是,这些不适用于 VARRAY,相反,您需要使用表集合表达式。

    如果你有桌子:

    CREATE TYPE phone_no_list AS VARRAY(10) OF VARCHAR2(15);
    
    CREATE TABLE people (
      name VARCHAR2(20),
      phone_nos phone_no_list
    );
    
    INSERT INTO people ( name, phone_nos )
    SELECT 'Alice', phone_no_list( '013579', '013560' ) FROM DUAL UNION ALL
    SELECT 'Beryl', phone_no_list( '088300', '088299' ) FROM DUAL UNION ALL
    SELECT 'Carol', phone_no_list( '123456', '987654' ) FROM DUAL UNION ALL
    SELECT 'Doris', phone_no_list( '000000', '111111', '222222' ) FROM DUAL;
    

    那么你可以使用:

    SELECT name
    FROM   people p
    WHERE  EXISTS(
             SELECT 1
             FROM   TABLE( p.phone_nos )
             WHERE  COLUMN_VALUE = '013579'
             OR     COLUMN_VALUE LIKE '0883%'
           )
    OR     ( SELECT COUNT(*) FROM TABLE( p.phone_nos ) ) = 3;
    

    哪些输出:

    |姓名 | | :---- | |爱丽丝 | |绿柱石 | |多丽丝 |

    或者:

    SELECT p.name,
           n.COLUMN_VALUE AS phone_no
    FROM   people p
           CROSS APPLY TABLE( p.phone_nos ) n
    WHERE  n.COLUMN_VALUE = '013579'
    OR     n.COLUMN_VALUE LIKE '0883%'
    

    哪些输出:

    姓名 |电话号码 :---- | :-------- 爱丽丝 | 013579 绿柱石 | 088300

    db小提琴here

    【讨论】:

      猜你喜欢
      • 2018-12-06
      • 2013-06-08
      • 2011-07-22
      • 2016-07-04
      • 2011-06-05
      • 2012-06-12
      • 2022-01-23
      相关资源
      最近更新 更多