如何查询特定字符串的 varray 属性,例如包含号码 013579 或以 0883 开头的电话号码数组?
另外,我如何查询以计算数组中的值的数量(例如,检查 varray 是否包含 3 个值)
如果它是一个集合,那么您可以使用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<>在这里摆弄