Sql 使用左连接时,如何显示区分空字符串值和不存在值的数据?
我需要创建一个表,其中包含来自不同数据库环境中不同表的列,并在这些表中使用公共键进行匹配。这些值中有许多是空的,但在某些环境中它们甚至不存在,这是我需要确定的问题,可能需要插入自定义字符串,例如\\NULL// 我有一组预生产环境,其中每个环境在一个表中都有很多配置参数,我将这些参数提取到一个巨大的表中 我现在正试图编写一个SQL来表示2D表环境中的某些参数集与参数x-ref值表,以确定有问题的值,即缺少一些参数Sql 使用左连接时,如何显示区分空字符串值和不存在值的数据?,sql,sql-server,varchar,Sql,Sql Server,Varchar,我需要创建一个表,其中包含来自不同数据库环境中不同表的列,并在这些表中使用公共键进行匹配。这些值中有许多是空的,但在某些环境中它们甚至不存在,这是我需要确定的问题,可能需要插入自定义字符串,例如\\NULL// 我有一组预生产环境,其中每个环境在一个表中都有很多配置参数,我将这些参数提取到一个巨大的表中 我现在正试图编写一个SQL来表示2D表环境中的某些参数集与参数x-ref值表,以确定有问题的值,即缺少一些参数 SELECT x0.envName, x1.param1,
SELECT x0.envName,
x1.param1,
x2.param2,
x3.param3
FROM ( ( (
(SELECT envName
FROM paramTable
GROUP BY envName) x0
LEFT JOIN
( SELECT envName,
parameterValue AS param1
FROM paramTable
WHERE parameterName='param1' ) x1 ON x1.envName = x0.envName )
LEFT JOIN
( SELECT envName,
parameterValue AS param2
FROM paramTable
WHERE parameterName='param2' ) x2 ON x2.envName = x0.envName )
LEFT JOIN
( SELECT envName,
parameterValue AS param3
FROM paramTable
WHERE parameterName='param3' ) x3 ON x3.envName = x0.envName)
如果我的参数表如下所示:
+ paramTable
=================================================
envName | paramName | paramValue |
-------------------------------------------------
env1 | param1 | abcdef |
env1 | param2 | 123456 |
env1 | param3 | A73BB2 |
env2 | param1 | klmnop |
env2 | param2 | 987654 |
env2 | param3 | |
env3 | param2 | uvwxyz |
+ PreferedQueryResult
=================================================================
envName | param1 | param2 | param3 |
-----------------------------------------------------------------
env1 | abcdef | 123456 | A73BB2 |
env2 | klmnop | 987654 | |
env3 | <<<!NULL!>>> | uvwxyz | <<<!NULL!>>> |
然后,此查询的结果表将不会区分空字符串值(如env2上的param3)和不存在的值(如env3中的param1和param3):
+ ResultQueryResult
=================================================================
envName | param1 | param2 | param3 |
-----------------------------------------------------------------
env1 | abcdef | 123456 | A73BB2 |
env2 | klmnop | 987654 | |
env3 | | uvwxyz | |
我想以某种方式修改SQL,这样结果查询将得到如下结果:
+ paramTable
=================================================
envName | paramName | paramValue |
-------------------------------------------------
env1 | param1 | abcdef |
env1 | param2 | 123456 |
env1 | param3 | A73BB2 |
env2 | param1 | klmnop |
env2 | param2 | 987654 |
env2 | param3 | |
env3 | param2 | uvwxyz |
+ PreferedQueryResult
=================================================================
envName | param1 | param2 | param3 |
-----------------------------------------------------------------
env1 | abcdef | 123456 | A73BB2 |
env2 | klmnop | 987654 | |
env3 | <<<!NULL!>>> | uvwxyz | <<<!NULL!>>> |
您可以简单地使用一个特殊常量,如和更改:
select paramValue
select paramValue
借
借
将内部表中的NOTNULL字段包含到结果中。然后,当该字段为NULL时,您知道内行不存在,而其可为NULL的字段为NULL 当在主键上加入ing时(主键必须不为NULL),您可以使用一个PK字段,在您的情况下,它似乎是envName/paramName。否则,您可以通过在子查询上加入ing来创建自己的非空字段:
...
LEFT JOIN (SELECT 1 inner_exists, <other fields> FROM inner ...) Q
ON ...
避免使用魔法值,因为你永远不知道它们是否真的存在于真实数据中。或者,如果你走这条路,使用一些不太可能出现的东西,比如GUID
DECLARE @paramTable TABLE (envName varchar(15), parameterName varchar(15), parameterValue varchar(15) )
INSERT INTO @paramTable (envName, parameterName, parameterValue)
VALUES
('env1','param1','abcdef')
,('env1','param2','123456')
,('env1','param3','A73BB2')
,('env2','param1','klmnop')
,('env2','param2','987654')
,('env2','param3','' )
,('env3','param2','uvwxyz')
select x0.envName, ISNULL(x1.param1,'<<!NULL!>>') as param1, ISNULL(x2.param2,'<<!NULL!>>') as param2,ISNULL(x3.param3,'<<!NULL!>>') as param3
from
(
(
(
(select envName from @paramTable group by envName) x0
left join
(
select envName, parameterValue as param1 from @paramTable where parameterName='param1'
) x1
on x1.envName = x0.envName
)
left join
(
select envName, parameterValue as param2 from @paramTable where parameterName='param2'
) x2
on x2.envName = x0.envName
)
left join (
select envName, parameterValue as param3 from @paramTable where parameterName='param3'
) x3
on x3.envName = x0.envName
)
结果:
envName param1 param2 param3
--------------- --------------- --------------- ---------------
env1 abcdef 123456 A73BB2
env2 klmnop 987654
env3 <<!NULL!>> uvwxyz <<!NULL!>>
我试图重写您的查询:
SELECT x0.envName,
CASE WHEN x1.parameterName='param1' THEN x1.param1 ELSE '<<!NULL!>>' END AS param1,
CASE WHEN x1.parameterName='param2' THEN x1.param1 ELSE '<<!NULL!>>' END AS param2,
CASE WHEN x1.parameterName='param3' THEN x1.param1 ELSE '<<!NULL!>>' END AS param3
FROM (SELECT envName
FROM paramTable
GROUP BY envName) x0
LEFT JOIN paramTable x1
ON x1.envName = x0.envName
关系数据库管理系统?以Oracle为例,这可能是不可能的,因为Oracle不区分空字符串和空值……不要用\\null///之类的东西弄乱数据,这只会给您带来很多麻烦。有一个拒绝空字符串的约束。@vc74当然,我用标记更新了帖子,它是Microsoft SQL Server@jarlh我不打算修改编译后的表,但我需要以OP中指定的方式呈现这个2D表。这似乎是我需要的,但它不起作用。请注意,nvl原来是一个oracle函数,MS SQL对应项为isNull。查询结果将用于向人眼演示,不会进一步处理。因此,与为每个参数包含某种标志或其他类型的存在列指示相比,使用魔法值可能是更好的选择。另一个关于魔法值和这些额外字段的论点是,结果将导出到excel文件,并且应该是过滤友好的;对于非技术性读者来说,能够在同一列中同时过滤空格和null可能会更直观。我实际上尝试过这种方法,但我没有为select行中的列提供别名as语句,因此它不起作用。。。然而,添加一个别名实际上解决了这个问题!非常感谢你!