如果第一个值不为空,则用另一个值替换一个值

问题描述

我有以下情况(请运行虚拟数据集),其中FS_Number具有真实的FS_Numbers,NULL和随机文本,例如N / A_ADMINIS2 这需要替换为FS_Number1中的值

SELECT 1 AS ID,214565 AS FS_Number1,Null AS  FS_Number
UNION
SELECT 2 AS ID,null   AS FS_Number1,'759843' AS  FS_Number
UNION
SELECT 3 AS  ID,'243545' AS  FS_Number
UNION
SELECT 4 AS ID,'655342' AS  FS_Number
UNION
SELECT 5 AS ID,897324 AS FS_Number1,'N/A_ADMINIS2' AS  FS_Number
UNION
SELECT 6 AS  ID,934895 AS FS_Number1,'N/A_ADMINIS2' AS  FS_Number
UNION
SELECT 7 AS ID,3453 AS FS_Number1,Null AS  FS_Number
UNION
SELECT 8 AS ID,85634542 AS FS_Number1,'N/A_3' AS  FS_Number
UNION
SELECT 9 AS  ID,3451124 AS FS_Number1,'N/A_1' AS  FS_Number

看起来像这样:

ID  FS_Number1  FS_Number
1   214565      NULL
2   NULL        759843
3   NULL        243545
4   NULL        655342
5   897324      N/A_ADMINIS2
6   934895      N/A_ADMINIS2
7   3453        NULL
8   85634542    N/A_3
9   3451124     N/A_1

结果应如下所示:

SELECT 1 AS ID,'214565' AS  FS_Number
UNION
SELECT 2 AS ID,'897324' AS  FS_Number
UNION
SELECT 6 AS  ID,'934895' AS  FS_Number
UNION
SELECT 7 AS ID,'3453' AS  FS_Number
UNION
SELECT 8 AS ID,'85634542' AS  FS_Number
UNION
SELECT 9 AS  ID,'3451124' AS  FS_Number

看起来像这样:

ID  FS_Number1  FS_Number
1   214565      214565
2   NULL        759843
3   NULL        243545
4   NULL        655342
5   897324      897324
6   934895      934895
7   3453        3453
8   85634542    85634542
9   3451124     3451124

我知道您可以用COALESCE替换NULL值,但就我而言,我也有一些文本需要用数字替换。 最好的方法是什么?

解决方法

您可以使用try_convert()进行此操作:

select id,fs_number1,case when try_convert(int,fs_number) is null
        then fs_number1
        else fs_number
    end as fs_number
from mytable

想法是尝试将值转换为数字。如果转换尝试返回null,则表明该字符串不是数字或null:在这种情况下,我们使用替代值。

Demo on DB Fiddle

id | fs_number1 | fs_number
-: | ---------: | --------:
 1 |     214565 |    214565
 2 |       null |    759843
 3 |       null |    243545
 4 |       null |    655342
 5 |     897324 |    897324
 6 |     934895 |    934895
 7 |       3453 |      3453
 8 |   85634542 |  85634542
 9 |    3451124 |   3451124
,

这类似于GMB的版本,但是使用合并而不是大小写。

select id,coalesce(try_convert(int,fs_number),fs_number1) as fs_number
from mytable