sql – 选择值为NULL的列名称

前端之家收集整理的这篇文章主要介绍了sql – 选择值为NULL的列名称前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
好的,4个小时的编码,只有6个小时的搜索…,我没有比我开始时更好.这是我的问题我有一个表(tmp Shell),它有12列.这是一个没有约束的基本表,用于临时报告.当我们插入数据时,我必须提取一个ID号(PatientId)和所有列NAMES,其中该PatientID的值为null.

例:

  1. PatientIdFnameLnameDOB
  2. 123455SamNULLNULL
    2345455NULLDoe1/1/1980
    09172349JohnJoneNULL

我想回来的是:

  1. PatientIdErrorMsg
  2. 123455Lname,DOB
    2345455Fname
    09172349DOB

当然,如果所有的列都有一个值,那么errormsg将为null.

我尝试并失败了大约300个不同的代码,但这似乎是我能得到的最接近的.不幸的是,这只返回EVERY列,而不是空值.

  1. ALTER PROC [sp_aaShowAllNullColumns]
  2. @tableName VARCHAR(255)
  3. AS
  4. BEGIN
  5. SET NOCOUNT ON;
  6.  
  7. DECLARE @sql NVARCHAR(4000);
  8. DECLARE @cols NVARCHAR(4000);
  9. DECLARE @tcols TABLE ( [colbit] NVARCHAR(255) );
  10. --DECLARE @tablename VARCHAR(255) = 'tmpShell';
  11. INSERT @tcols
  12. SELECT
  13. 'count(' + [columns].[name] + ') as ' + [columns].[name] + ',' AS [colbit]
  14. FROM
  15. [sys].[columns]
  16. WHERE
  17. [columns].[object_id] = OBJECT_ID(@tableName);
  18.  
  19.  
  20. SELECT
  21. @cols = COALESCE(@cols,','') + [@tcols].[colbit]
  22. FROM
  23. @tcols;
  24. SELECT
  25. @cols = SUBSTRING(@cols,1,( LEN(@cols) - 1 ));
  26. SELECT
  27. @cols = ISNULL(@cols,'');
  28.  
  29. SELECT
  30. @sql = 'select patientid,count(*) as Rows' + @cols + ' from ' + @tableName + ' group by patientid having count(*) > 0';
  31. CREATE TABLE [tmpShell2]
  32. (
  33. [patientid] VARCHAR(15),[Rows] CHAR(2),[Rn] CHAR(2),[patId] CHAR(2),[fname] CHAR(2),[lname] CHAR(2),[dob] CHAR(2),[addr1] CHAR(2),[city] CHAR(2),[state] CHAR(2),[zip] CHAR(2),[country] CHAR(2),[psite] CHAR(2),[csite] CHAR(2),[ssite] CHAR(2),[scode] CHAR(2),[sfid] CHAR(2),[taskid] CHAR(2),[errormsg] CHAR(2)
  34. );
  35. INSERT INTO [tmpShell2]
  36. EXEC [sys].[sp_executesql]
  37. @sql;
  38.  
  39. DECLARE @tbl VARCHAR(255) = 'tmpShell2';
  40. SELECT DISTINCT
  41. [TS].[patientid],STUFF((
  42. SELECT DISTINCT
  43. ',' + [C].[name]
  44. FROM
  45. [tmpShell2] AS [TS2]
  46. JOIN [sys].[columns] AS [C]
  47. ON [C].[object_id] = OBJECT_ID(@tbl)
  48. WHERE
  49. [C].[name] NOT IN ( 'SFID','TaskId','ErrorMsg' )
  50. AND [C].[name] IS NOT NULL
  51. FOR
  52. XML PATH('')
  53. ),'')
  54. FROM
  55. [tmpShell2] AS [TS];
  56.  
  57. DROP TABLE [dbo].[tmpShell2];
  58.  
  59. END;
  60. GO
  61. EXEC [sp_aaShowAllNullColumns]
  62. 'tmpShell';
  63. </pre>

解决方法

这样的东西怎么样?
  1. SELECT
  2. a.PatientID,CASE a.tmpCol
  3. WHEN '' THEN NULL
  4. ELSE STUFF(a.tmpCol,'')
  5. END AS ErrorMsg
  6. FROM
  7. (
  8. SELECT
  9. PatientID,CASE WHEN FirstName IS NULL THEN ',FirstName' ELSE '' END
  10. + CASE WHEN LastName IS NULL THEN ',LastName' ELSE '' END
  11. + CASE WHEN DOB IS NULL THEN ',DOB' ELSE '' END AS tmpCol
  12. FROM
  13. <tableName>
  14. ) a;

猜你在找的MsSQL相关文章