我有以下列(lock_reason),我想獲得所需的輸出列。邏輯:如果修剪除字母之外的所有內容,結果字串僅由 L 或 P 字符組成,則 'X' 否則為 NULL。
LOCK_REASON DESIRED_OUTPUT
--------------------------------
2P, Q NULL
R NULL
3A, 2B, 7Z NULL
L, 9P X
P X
7A, 2L NULL
P, L X
uj5u.com熱心網友回復:
另一種選擇是使用組合
regexp_replace(洗掉所有不是字母的東西)和translate(去除P和L從剩下的東西)。
剩下的很簡單(case,對吧?)。
SQL> select lock_reason,
2 case when translate(regexp_replace(lock_reason, '[^[:alpha:]]', null), '#PL', '#') is null then 'X'
3 else null
4 end as result
5 from test;
LOCK_REASON RESULT
------------ ----------
2P, Q
R
3A, 2B, 7Z
L, 9P X
P X
7A, 2L
P, L X
7 rows selected.
SQL>
uj5u.com熱心網友回復:
假設您要洗掉所有非字母字符,然后檢查剩余的字串是否僅為L或P字符,則:
SELECT lock_reason,
CASE
WHEN REGEXP_LIKE( REGEXP_REPLACE( lock_reason, '[^A-Z]' ), '^[LP] $' )
THEN 'X'
END AS desired_output
FROM table_name;
如果您的字串由逗號空格分隔的術語組成,其中包含一個可選數字,然后是一個字母字符,那么您可以使用:
SELECT lock_reason,
CASE
WHEN REGEXP_LIKE( lock_reason, '^(\d*[LP], )*\d*[LP]$' )
THEN 'X'
END AS desired_output
FROM table_name;
其中,對于樣本資料:
CREATE TABLE table_name ( LOCK_REASON ) AS
SELECT '2P, Q' FROM DUAL UNION ALL
SELECT 'R' FROM DUAL UNION ALL
SELECT '3A, 2B, 7Z' FROM DUAL UNION ALL
SELECT 'L, 9P' FROM DUAL UNION ALL
SELECT 'P' FROM DUAL UNION ALL
SELECT '7A, 2L' FROM DUAL UNION ALL
SELECT 'P, L' FROM DUAL;
兩個輸出:
鎖定原因 DESIRED_OUTPUT 2P,Q 電阻 3A、2B、7Z 大號,9P X 磷 X 7A、2L P、L X
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/314314.html
上一篇:當我對ORACLE中的列執行Max時,如何使用來自另一個表的連接?
下一篇:包含條件時CTAS較慢
