在Oracle 11g数据库中,我有一个名为organizations
的表,看起来像这样:
| ORGANIZATION_ID | ORGANIZATION_NAME | TREE_ORGANIZATION_ID | ORGANIZATION_RANG |
|-----------------|-------------------|----------------------|-------------------|
| 1 | Facebook | \1 | 1 |
| 2 | Instagram | \1\2 | 2 |
| 3 | Whatsapp | \1\3 | 2 |
| 4 | Alphabet | \4 | 1 |
| 5 | Nest | \4\5 | 2 |
| 6 | Google | \4\6 | 2 |
| 7 | YouTube | \4\6\7 | 3 |
如您所见,该表具有名为TREE_ORGANIZATION_ID
的列,我在其中存储有关组织关系的信息。
此代码返回TREE_ORGANIZATION_ID
列中具有特定ID的所有组织。就我而言,此代码返回Google
和YouTube
条目。
SELECT
*
FROM
ORGANIZATIONS
WHERE
TREE_ORGANIZATION_ID LIKE '%\' || '6'
OR
TREE_ORGANIZATION_ID LIKE '%\' || '6' || '\%';
我要添加一个名为STATUS
的新列,它看起来像这样:
| ORGANIZATION_ID | ORGANIZATION_NAME | TREE_ORGANIZATION_ID | ORGANIZATION_RANG | STATUS |
|-----------------|-------------------|----------------------|-------------------|----------|
| 6 | Google | \4\6 | 2 | root |
| 7 | YouTube | \4\6\7 | 3 | not root |
我尝试了下一个代码,但它引发了错误ORA-00937 not a single-group group function
。
如何根据另一列的值创建一个新列?
SELECT
ORGANIZATION_ID,
ORGANIZATION_NAME,
TREE_ORGANIZATION_ID,
CASE
WHEN ORGANIZATION_RANG = MIN(ORGANIZATION_RANG) THEN 'root'
ELSE 'not root'
END AS STATUS
FROM
ORGANIZATIONS
WHERE
TREE_ORGANIZATION_ID LIKE '%\' || '6'
OR
TREE_ORGANIZATION_ID LIKE '%\' || '6' || '\%';
答案 0 :(得分:2)
您可以在下面尝试-
SELECT
ORGANIZATION_ID,
ORGANIZATION_NAME,
TREE_ORGANIZATION_ID,
CASE
WHEN TREE_ORGANIZATION_ID LIKE '%\' || '6' THEN 'root'
when TREE_ORGANIZATION_ID LIKE '%\' || '6' || '\%' then 'not root'
END AS STATUS
FROM
ORGANIZATIONS
WHERE
TREE_ORGANIZATION_ID LIKE '%\' || '6'
OR
TREE_ORGANIZATION_ID LIKE '%\' || '6' || '\%'
答案 1 :(得分:1)
您要使用分析功能,而不是聚合功能:
SELECT ORGANIZATION_ID, ORGANIZATION_NAME, TREE_ORGANIZATION_ID,
(CASE WHEN ORGANIZATION_RANG = MIN(ORGANIZATION_RANG) OVER ()
THEN 'root'
ELSE 'not root'
END) AS STATUS
FROM ORGANIZATIONS O
WHERE TREE_ORGANIZATION_ID || '\' LIKE '%\' || '6' || '\%';
请注意,这还通过测试组织ID(最后带有反斜杠)来简化匹配6
的逻辑。您也可以为此使用REGEXP_LIKE()
。