需要帮助将字母数字列值转换为 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]+$';
我需要帮助将字母数字值从 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]+$';