我必须编写一个查询来获得以下数据作为结果。我的数据库中有四列。ID不为null,所有其他ID的值都可以为null。
EMP_ID EMP_FIRST_NAME EMP_LAST_NAME EMP_PHONE
1 John Williams +123456789
2 Rodney +124568937
3 Jackson +124578963
4 Joyce Nancy 现在,我必须编写一个查询来返回非null的列。我不想在查询中指定列名。
我的意思是,我想使用SELECT * FROM TABLE WHERE -并添加过滤器,但我不想在WHERE子句后指定列名。
这个问题可能很愚蠢,但请在必要的地方纠正我。我是sql新手,正在处理一个使用c#和SQL的项目。
为什么我不想使用列名,因为我有超过250列和1500行。现在,如果我选择任何行,至少有一列将具有空值。我想选择该行,但该特定行的值为null的列不应出现在结果中。
敬请指教。提前谢谢你。
致以问候,Vinay S
发布于 2011-07-27 03:25:11
你的问题是:
我想要得到所有没有
null值的列。
同时:
,但我不想在
WHERE子句中指定列名。
这些是相互冲突的目标。惟一的选择是使用sys.tables和SQL来构建一系列动态sys.columns语句。最后,这将是更多的工作,而不仅仅是第一次手工编写一个查询。
发布于 2011-07-27 03:28:53
从SQL查询返回的每一行都必须包含与集合中其他行完全相同的列。除非集合中的所有结果都具有相同的空列,并且您在select子句(而不是where子句)中指定了空列,否则无法只选择那些不返回null的列。
对于Anders Abels对你的问题的评论,你可以通过将你的数据分成服务于公共目的的表来避免大量的查询复杂性(称为规范化)。
例如,您可以将姓名放入一个表(Employee_ID、First_Name、Last_Name、Middle_Name、Title),将地点放入另一个表(Address_ID、Address_Name、街道、城市、州),将关系放入另一个表,然后将它们链接在一起的2-4列表。以这种方式组织您的数据可以避免重复个别事实,例如,“谁是John Williams的主管,我如何联系此人。”
发布于 2011-07-27 03:32:40
您可以使用动态PIVOT / UNPIVOT方法来实现这一点,前提是您的SQL Server版本支持它(您将需要SQL Server 2005或更高版本),这将基于以下链接中的概念:
实际上,您将选择一行,将您的列转换为透视表中的行,过滤掉NULL条目,然后将其取消透视为单行。不过,这将是一段丑陋而复杂的代码。
https://stackoverflow.com/questions/6835321
复制相似问题