我正在嘗試查詢 Oracle DB 中的名稱欄位,如下所示
select NAME, Substr(NAME,1,instr(NAME,' ') - 1) as SHORTNAME from rm_room
我正在嘗試的是,如果 Name 欄位在字串之間有空格,則只選擇空格左側的字符。我期待上述查詢回傳
| 姓名 | 簡稱 |
|---|---|
| AX1 BD | AX1 |
| A1 | A1 |
| BC W1 | 公元前 |
但問題是如果 name 欄位沒有空格,那么它在 SHORTNAME 欄位中回傳 null
| 姓名 | 簡稱 |
|---|---|
| AX1 BD | AX1 |
| A1 | 空值 |
| BC W1 | 公元前 |
我們可以在 select 子句中使用 if 條件,如果可以,我該如何檢查
uj5u.com熱心網友回復:
正則運算式(見第 7 行):
SQL> with rm_room (name) as
2 (select 'AX1 BD' from dual union all
3 select 'A1' from dual union all
4 select 'BC W1' from dual
5 )
6 select name,
7 regexp_substr(name, '^\w ') shortname
8 from rm_room ;
NAME SHORTN
------ ------
AX1 BD AX1
A1 A1
BC W1 BC
SQL>
uj5u.com熱心網友回復:
使用CASE運算式:
select NAME,
CASE instr(NAME,' ')
WHEN 0
THEN name
ELSE Substr(NAME,1,instr(NAME,' ') - 1)
END as SHORTNAME
from rm_room
其中,對于樣本資料:
CREATE TABLE rm_room (NAME) AS
SELECT 'AX1 BD' FROM DUAL UNION ALL
SELECT 'A1' FROM DUAL UNION ALL
SELECT 'BC W1' FROM DUAL;
輸出:
姓名 簡稱 AX1 BD AX1 A1 A1 BC W1 公元前
您還可以使用正則運算式:
select NAME,
REGEXP_SUBSTR(name, '^[^ ] ') as SHORTNAME
from rm_room
然而,它們比簡單的字串函式慢得多(即使代碼更短)。
db<>在這里擺弄
uj5u.com熱心網友回復:
您可以使用設定默認值而不是 null 的 NVL 函式
select NAME, NVL(Substr(NAME,1,instr(NAME,' ') - 1),NAME) as SHORTNAME from rm_room
uj5u.com熱心網友回復:
檢查名稱是否包含空格
select NAME,
Case WHEN instr(NAME,' ') > 0 THEN Substr(NAME,1,instr(NAME,' ') - 1)
Else NAME End as SHORTNAME
from rm_room
最好使用Trim 功能剪切房間名稱開頭或結尾的任何空格
select NAME,
Case WHEN instr( TRIM(NAME),' ') > 0 THEN Substr(TRIM(NAME),1,instr(TRIM(NAME),' ') - 1)
Else TRIM(NAME) End as SHORTNAME
from rm_room
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/356371.html
