Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用左连接时,如何显示区分空字符串值和不存在值的数据?_Sql_Sql Server_Varchar - Fatal编程技术网

Sql 使用左连接时,如何显示区分空字符串值和不存在值的数据?

Sql 使用左连接时,如何显示区分空字符串值和不存在值的数据?,sql,sql-server,varchar,Sql,Sql Server,Varchar,我需要创建一个表,其中包含来自不同数据库环境中不同表的列,并在这些表中使用公共键进行匹配。这些值中有许多是空的,但在某些环境中它们甚至不存在,这是我需要确定的问题,可能需要插入自定义字符串,例如\\NULL// 我有一组预生产环境,其中每个环境在一个表中都有很多配置参数,我将这些参数提取到一个巨大的表中 我现在正试图编写一个SQL来表示2D表环境中的某些参数集与参数x-ref值表,以确定有问题的值,即缺少一些参数 SELECT x0.envName, x1.param1,

我需要创建一个表,其中包含来自不同数据库环境中不同表的列,并在这些表中使用公共键进行匹配。这些值中有许多是空的,但在某些环境中它们甚至不存在,这是我需要确定的问题,可能需要插入自定义字符串,例如\\NULL//

我有一组预生产环境,其中每个环境在一个表中都有很多配置参数,我将这些参数提取到一个巨大的表中

我现在正试图编写一个SQL来表示2D表环境中的某些参数集与参数x-ref值表,以确定有问题的值,即缺少一些参数

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语句,因此它不起作用。。。然而,添加一个别名实际上解决了这个问题!非常感谢你!