0

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

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

4

1 回答 1

0

如果它是一个集合,那么您可以使用MEMBER OF运算符来查找一个元素是否包含在一个集合中,或者使用该CARDINALITY函数来检查集合的大小;但是,这些不适用于 a 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<>在这里摆弄

于 2021-03-24T23:58:50.920 回答