如何在 Oracle 中使用 decode 替换任何形式的单词 null?
How to REPLACE any form of the word null using decode in Oracle?
SELECT DECODE(
add1,
null, '.',
' ', '.',
'{null}','.',
LTRIM( RTRIM( REPLACE( add1,'"','.'), ' '), ' ')
),
code,
add1
FROM addrlist
我正在尝试用点替换任何空词(任何不区分大小写的词 null
或 nuLL
或 NulL
等)或 add1 (varchar2) 的空白值(.
).
上面的代码并没有完全实现,请问有没有更好的解决方案
更新:列 add1 将仅包含任何形式的单个字符串 null,在单词 null 的开头或结尾可能只有空格。请在下面找到一些示例:
Input | Expected Result
-------------------------------------
'nuLL' | '.'
' NuLL ' | '.'
'null' | '.'
NULL | '.'
select regexp_replace(nvl(add1, 'NULL'), '(^|\s)(NULL)(\s|$)', '.', 1, 0, 'im')
from
(select 'NUll sdfsdfasdf null xzxx nullable nil; null' as add1 from dual)
结果:
. sdfsdfasdf . xzxx nullable nil; .
我假设你只想替换整个单词 NULL 而不是字母组合(这就是为什么我把单词 "nullable" 保持不变)。
Oracle 11g R2 架构设置:
CREATE TABLE SENTENCES ( sentence ) AS
SELECT 'Null' FROM DUAL
UNION ALL SELECT 'null' FROM DUAL
UNION ALL SELECT 'NULL' FROM DUAL
UNION ALL SELECT ' Null' || CHR(9) FROM DUAL
UNION ALL SELECT NULL FROM DUAL
UNION ALL SELECT '{NULL}' FROM DUAL
UNION ALL SELECT '""' FROM DUAL
UNION ALL SELECT '''''' FROM DUAL
UNION ALL SELECT ' ' ||CHR(13)||CHR(10) FROM DUAL
UNION ALL SELECT 'Not-Null' FROM DUAL;
查询 1:
使用正则表达式 ^\W*(NULL)?\W*$
- 匹配字符串的开头 ^
然后是零个或多个非单词字符 \W*
然后是可选的 NULL
字符串(NULL)?
然后是零个或多个非单词字符 \W*
最后是字符串结尾 $
(使用不区分大小写的匹配)。
SELECT sentence,
CASE WHEN sentence IS NULL THEN '.'
ELSE REGEXP_REPLACE( sentence, '^\W*(NULL)?\W*$', '.', 1, 0, 'i' )
END AS unnulled_sentence
FROM SENTENCES
查询 2:
SELECT sentence,
DECODE(
sentence,
NULL,
'.',
REGEXP_REPLACE( sentence, '^\W*(NULL)?\W*$', '.', 1, 0, 'i' )
) AS unnulled_sentence
FROM SENTENCES
(两个查询给出相同的结果)
| SENTENCE | UNNULLED_SENTENCE |
|----------|-------------------|
| Null | . |
| null | . |
| NULL | . |
| Null | . |
| (null) | . |
| {NULL} | . |
| "" | . |
| '' | . |
| | . |
| Not-Null | Not-Null |
例如:
DECLARE
xi VARCHAR2(100) := NULL;
xi_decode VARCHAR2(100);
BEGIN
SELECT DECODE(xi, NULL, 0, 1) INTO xi_decode FROM Dual;
DBMS_OUTPUT.PUT_LINE(xi_decode);
END;
/
您可以在“1”的位置放置另一个 DECODE()。
在我的示例中,如果 DECODE 为 NULL,那么我们将其替换为 0。
如果不是这种情况,它将为“1”。
这是一个link,我认为解释得很好:Link
在数据库中有一个字符串充满 'NULL' 或 'Null' 或其他任何词是很奇怪的。
但是,好吧,您想用点替换空字符串和包含单词 'NULL' 的字符串。您可以自己尝试使用 DECODE 来执行此操作。仅 trim 空格字符串并将其转换为小写以便于比较:
select decode( lower(trim(add1)) , null,'.' , 'null','.' , add1)
from addrlist;
SELECT DECODE(
add1,
null, '.',
' ', '.',
'{null}','.',
LTRIM( RTRIM( REPLACE( add1,'"','.'), ' '), ' ')
),
code,
add1
FROM addrlist
我正在尝试用点替换任何空词(任何不区分大小写的词 null
或 nuLL
或 NulL
等)或 add1 (varchar2) 的空白值(.
).
上面的代码并没有完全实现,请问有没有更好的解决方案
更新:列 add1 将仅包含任何形式的单个字符串 null,在单词 null 的开头或结尾可能只有空格。请在下面找到一些示例:
Input | Expected Result
-------------------------------------
'nuLL' | '.'
' NuLL ' | '.'
'null' | '.'
NULL | '.'
select regexp_replace(nvl(add1, 'NULL'), '(^|\s)(NULL)(\s|$)', '.', 1, 0, 'im')
from
(select 'NUll sdfsdfasdf null xzxx nullable nil; null' as add1 from dual)
结果:
. sdfsdfasdf . xzxx nullable nil; .
我假设你只想替换整个单词 NULL 而不是字母组合(这就是为什么我把单词 "nullable" 保持不变)。
Oracle 11g R2 架构设置:
CREATE TABLE SENTENCES ( sentence ) AS
SELECT 'Null' FROM DUAL
UNION ALL SELECT 'null' FROM DUAL
UNION ALL SELECT 'NULL' FROM DUAL
UNION ALL SELECT ' Null' || CHR(9) FROM DUAL
UNION ALL SELECT NULL FROM DUAL
UNION ALL SELECT '{NULL}' FROM DUAL
UNION ALL SELECT '""' FROM DUAL
UNION ALL SELECT '''''' FROM DUAL
UNION ALL SELECT ' ' ||CHR(13)||CHR(10) FROM DUAL
UNION ALL SELECT 'Not-Null' FROM DUAL;
查询 1:
使用正则表达式 ^\W*(NULL)?\W*$
- 匹配字符串的开头 ^
然后是零个或多个非单词字符 \W*
然后是可选的 NULL
字符串(NULL)?
然后是零个或多个非单词字符 \W*
最后是字符串结尾 $
(使用不区分大小写的匹配)。
SELECT sentence,
CASE WHEN sentence IS NULL THEN '.'
ELSE REGEXP_REPLACE( sentence, '^\W*(NULL)?\W*$', '.', 1, 0, 'i' )
END AS unnulled_sentence
FROM SENTENCES
查询 2:
SELECT sentence,
DECODE(
sentence,
NULL,
'.',
REGEXP_REPLACE( sentence, '^\W*(NULL)?\W*$', '.', 1, 0, 'i' )
) AS unnulled_sentence
FROM SENTENCES
(两个查询给出相同的结果)
| SENTENCE | UNNULLED_SENTENCE |
|----------|-------------------|
| Null | . |
| null | . |
| NULL | . |
| Null | . |
| (null) | . |
| {NULL} | . |
| "" | . |
| '' | . |
| | . |
| Not-Null | Not-Null |
例如:
DECLARE
xi VARCHAR2(100) := NULL;
xi_decode VARCHAR2(100);
BEGIN
SELECT DECODE(xi, NULL, 0, 1) INTO xi_decode FROM Dual;
DBMS_OUTPUT.PUT_LINE(xi_decode);
END;
/
您可以在“1”的位置放置另一个 DECODE()。
在我的示例中,如果 DECODE 为 NULL,那么我们将其替换为 0。
如果不是这种情况,它将为“1”。
这是一个link,我认为解释得很好:Link
在数据库中有一个字符串充满 'NULL' 或 'Null' 或其他任何词是很奇怪的。
但是,好吧,您想用点替换空字符串和包含单词 'NULL' 的字符串。您可以自己尝试使用 DECODE 来执行此操作。仅 trim 空格字符串并将其转换为小写以便于比较:
select decode( lower(trim(add1)) , null,'.' , 'null','.' , add1)
from addrlist;