需要帮助将字母数字列值转换为 NULL

Need help in converting alphanumeric column values to NULL

我需要帮助将字母数字值从 Col_A 替换为 NULL

SELECT distinct o_id,
CASE when REGEXP_COUNT(Col_A,'^[0-9]+$')=1 then null else Col_A end 
as Col_1
FROM db_name.schema_name.table_name
WHERE date_ordered  = '2022-02-03'

当我 运行 下面的查询时,我得到一个 NULL 值和一个 NOT NULL 值 O_ID

select distinct o_id,Col_A from db_name.schema_name.table_005
WHERE o_id='3351456'
AND date_ordered= '2022-02-03'
O_ID COL_A
93261 NULL
93261 ABCDE12345

如果我们在WHERE子句中加入Col_A IS NOT NULL,我们将不会得到结果中的NULL值。

还有其他方法可以实现吗?结果不应包含 NULL 值,它应如下所示:

O_ID COL_A
93261 ABCDE12345

添加 HAVING 子句在聚合阶段(DISTINCT)之后运行

SELECT DISTINCT o_id,
CASE when REGEXP_COUNT(Col_A,'^[0-9]+$')=1 then null else Col_A END as Col_1
FROM table_005
WHERE date_ordered  = '2022-02-03'
HAVING Col_1 IS NOT NULL;    

给你预期的结果。

O_ID COL_1
93261 ABCDE12345

对于以下数据:

create table table_005 AS
     SELECT * FROM VALUES
        (93261, NULL, '2022-02-03'),
        (93261, 'ABCDE12345', '2022-02-03')
        v(O_ID, COL_A, date_ordered);      

还有

CASE when REGEXP_COUNT(Col_A,'^[0-9]+$')=1 then null else Col_A END as Col_1

可以通过使用 IFF

变得更小
IFF( REGEXP_COUNT(Col_A,'^[0-9]+$')=1,  null, Col_A) as Col_1b

但实际上将这一切移动到带有 REGEXP 子句的 WHERE 部分更有意义

SELECT o_id
    ,Col_A
FROM table_005
WHERE date_ordered  = '2022-02-03' 
  AND col_a not regexp '^[0-9]+$';

给出:

O_ID COL_A
93261 ABCDE12345

字母数字部分

如果您想像标题所说的那样匹配字母数字,则需要将 a-z 添加到您的匹配模式中。那么您将需要使用不区分大小写的匹配( 不适用于 WHERE REGEXP 版本)或显式匹配,可以使用:

SELECT o_id
    ,Col_A
    ,REGEXP_COUNT(Col_A,'^[0-9]+$') as match_just_numbers
    ,REGEXP_COUNT(Col_A,'^[a-z0-9]+$',1,'i') as match_alhpa_numeric_case_insensitive
    ,REGEXP_COUNT(Col_A,'^[a-zA-Z0-9]+$') as match_alhpa_numeric_explicit
FROM VALUES        
    (1, NULL),
    (2, 'ABCDE12345'),
    (3, '12345'),
    (4, 'ABCDE'),
    (5, 'ABC!DE'),
    (6, '3.00')
    v(o_id, col_a)
ORDER BY 1
;    

但以上给出:

O_ID COL_A MATCH_JUST_NUMBERS MATCH_ALHPA_NUMERIC_CASE_INSENSITIVE MATCH_ALHPA_NUMERIC_EXPLICIT
1
2 ABCDE12345 0 1 1
3 12345 1 1 1
4 ABCDE 0 1 1
5 ABC!DE 0 0 0
6 3.00 0 0 0

这表明您使用的是 exclude 而不是 alpha-numeric 您可能应该使用的值:

SELECT o_id
    ,Col_A
FROM table_005
WHERE date_ordered  = '2022-02-03' 
  AND col_a not regexp '^[a-zA-Z0-9]+$';