搜索存储在列中的列表并使用 SQL 消除行
Search List Stored in Column and Eliminate Row with SQL
我在 Oracle 数据库中有一个 table (MYTABLE),它有一列存储项目列表。类似于:
ITEM_ID
ITEMS
5476301
B, L, M, PP, S, TT
5579504
B, L, M, PP, S, TT
5579504
B, L, PP, S, TT
4005953
L
4064254
L, M
4121291
PP
4162254
M
4189256
M, PP
4255971
M, PP
我正在尝试构建一个 SQL 查询,以消除列表中 'M' 所在的所有行。因此,鉴于上述 table,我想 return 以下内容:
ITEM_ID
ITEMS
5579504
B, L, PP, S, TT
4005953
L
4121291
PP
我以前从未使用过存储在列中的列表。我倾向于做类似
的事情
SELECT * FROM MYTABLE
WHERE 'M' not in ITEMS
但这似乎不起作用。它仍然是 return 的所有行。我也在考虑解析列表中的每个项目以根据标准进行评估,但是我还没有找到一个示例来说明它是如何工作的。我觉得这很简单,但我还没有找到一种方法来做到这一点。任何建议表示赞赏。
您的列只是一个字符串,在任何意义上都不会被 Oracle 识别为“列表”。因此,您需要通过字符串操作来实现您的逻辑。例如,
SELECT item_id, items
FROM my_table
WHERE ','||replace(items,' ','')||',' NOT LIKE '%,M,%';
完整示例,感兴趣的读者:
with my_table (item_id, items) as (
SELECT 5476301, 'B, L, M, PP, S, TT' FROM DUAL UNION ALL
SELECT 5579504, 'B, L, M, PP, S, TT' FROM DUAL UNION ALL
SELECT 5579504, 'B, L, PP, S, TT' FROM DUAL UNION ALL
SELECT 4005953, 'L' FROM DUAL UNION ALL
SELECT 4064254, 'L, M' FROM DUAL UNION ALL
SELECT 4121291, 'PP' FROM DUAL UNION ALL
SELECT 4162254, 'M' FROM DUAL UNION ALL
SELECT 4189256, 'M, PP' FROM DUAL UNION ALL
SELECT 4255971, 'M, PP' FROM DUAL )
SELECT item_id, items
FROM my_table
WHERE ','||replace(items,' ','')||',' NOT LIKE '%,M,%';
+---------+-----------------+
| ITEM_ID | ITEMS |
+---------+-----------------+
| 5579504 | B, L, PP, S, TT |
| 4005953 | L |
| 4121291 | PP |
+---------+-----------------+
社论:这几乎肯定不是实施或保留的良好数据模型,如果您有任何时间和权力更改它。
我在 Oracle 数据库中有一个 table (MYTABLE),它有一列存储项目列表。类似于:
ITEM_ID | ITEMS |
---|---|
5476301 | B, L, M, PP, S, TT |
5579504 | B, L, M, PP, S, TT |
5579504 | B, L, PP, S, TT |
4005953 | L |
4064254 | L, M |
4121291 | PP |
4162254 | M |
4189256 | M, PP |
4255971 | M, PP |
我正在尝试构建一个 SQL 查询,以消除列表中 'M' 所在的所有行。因此,鉴于上述 table,我想 return 以下内容:
ITEM_ID | ITEMS |
---|---|
5579504 | B, L, PP, S, TT |
4005953 | L |
4121291 | PP |
我以前从未使用过存储在列中的列表。我倾向于做类似
的事情SELECT * FROM MYTABLE
WHERE 'M' not in ITEMS
但这似乎不起作用。它仍然是 return 的所有行。我也在考虑解析列表中的每个项目以根据标准进行评估,但是我还没有找到一个示例来说明它是如何工作的。我觉得这很简单,但我还没有找到一种方法来做到这一点。任何建议表示赞赏。
您的列只是一个字符串,在任何意义上都不会被 Oracle 识别为“列表”。因此,您需要通过字符串操作来实现您的逻辑。例如,
SELECT item_id, items
FROM my_table
WHERE ','||replace(items,' ','')||',' NOT LIKE '%,M,%';
完整示例,感兴趣的读者:
with my_table (item_id, items) as (
SELECT 5476301, 'B, L, M, PP, S, TT' FROM DUAL UNION ALL
SELECT 5579504, 'B, L, M, PP, S, TT' FROM DUAL UNION ALL
SELECT 5579504, 'B, L, PP, S, TT' FROM DUAL UNION ALL
SELECT 4005953, 'L' FROM DUAL UNION ALL
SELECT 4064254, 'L, M' FROM DUAL UNION ALL
SELECT 4121291, 'PP' FROM DUAL UNION ALL
SELECT 4162254, 'M' FROM DUAL UNION ALL
SELECT 4189256, 'M, PP' FROM DUAL UNION ALL
SELECT 4255971, 'M, PP' FROM DUAL )
SELECT item_id, items
FROM my_table
WHERE ','||replace(items,' ','')||',' NOT LIKE '%,M,%';
+---------+-----------------+ | ITEM_ID | ITEMS | +---------+-----------------+ | 5579504 | B, L, PP, S, TT | | 4005953 | L | | 4121291 | PP | +---------+-----------------+
社论:这几乎肯定不是实施或保留的良好数据模型,如果您有任何时间和权力更改它。