如何在 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

我正在尝试用点替换任何空词(任何不区分大小写的词 nullnuLLNulL 等)或 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" 保持不变)。

SQL Fiddle

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

Results:

(两个查询给出相同的结果)

| 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;