当前位置: 首页 > 面试题库 >

在表中的SQL Server中查找非空列

孙清野
2023-03-14
问题内容

我已经阅读了许多答案,但是它们全都适用于PL / SQL或Oracle,对于Microsoft SQL-Server我找不到任何答案。

我的桌子:

CREATE TABLE StudentScore
(
  Student_ID INT PRIMARY KEY,
  Student_Name NVARCHAR (50),
  Student_Score INT
)

GO

INSERT INTO StudentScore VALUES (1,'Ali', NULL)
INSERT INTO StudentScore VALUES (2,'Zaid', 770)
INSERT INTO StudentScore VALUES (3,'Mohd', 1140)
INSERT INTO StudentScore VALUES (4,NULL, 770)
INSERT INTO StudentScore VALUES (5,'John', 1240)
INSERT INTO StudentScore VALUES (6,'Mike', 1140)
INSERT INTO StudentScore VALUES (7,'Goerge', NULL)
  1. 如何查找所有非空列的名称。
  2. 返回表仅包含非空列

根据评论进行编辑:

我知道的IS_NULLABLE属性Information_schema。但是,仅仅因为一列允许空值并不意味着它实际上将具有空值。如何找出实际上具有空值的列。

我正在寻找与num_nullsMicrosoft SQL-SERVER相当的产品。


问题答案:

您可以通过发出以下命令来实现:

SELECT 
  FORMATMESSAGE('SELECT col = ''%s.%s.%s'' FROM %s.%s HAVING COUNT(*) != COUNT(%s)', 
     QUOTENAME(TABLE_SCHEMA),
     QUOTENAME(TABLE_NAME),
     QUOTENAME(COLUMN_NAME),
     QUOTENAME(TABLE_SCHEMA),
     QUOTENAME(TABLE_NAME),
     QUOTENAME(COLUMN_NAME)
  )
FROM INFORMATION_SCHEMA.COLUMNS
WHERE IS_NULLABLE = 'YES';

db <>
fiddle演示

它将生成用于检查单个列的脚本。

HAVING COUNT(*) != COUNT(col_name) -- it means that column contains at least single NULL

HAVING COUNT(col_name) = 0 AND COUNT(*) != 0 -- it means all values in columns are NULL

可以通过使用STRING_AGG每个表获取单个查询来完善此方法,而使用动态SQL可以避免复制查询的需要。

编辑:

完全烘烤的解决方案:

DECLARE @sql NVARCHAR(MAX);

SELECT @sql = STRING_AGG(
  FORMATMESSAGE('SELECT table_schema = ''%s''
                        ,table_name = ''%s''
                        ,table_col_name = ''%s'' 
                        ,row_num = COUNT(*)
                        ,row_num_non_nulls = COUNT(%s)
                        ,row_num_nulls = COUNT(*) - COUNT(%s)
                 FROM %s.%s', 
     QUOTENAME(TABLE_SCHEMA),
     QUOTENAME(TABLE_NAME),
     QUOTENAME(COLUMN_NAME),
     QUOTENAME(COLUMN_NAME),
     QUOTENAME(COLUMN_NAME),
     QUOTENAME(TABLE_SCHEMA),
     QUOTENAME(TABLE_NAME),
     QUOTENAME(COLUMN_NAME)), ' UNION ALL' + CHAR(13)
               ) WITHIN GROUP(ORDER BY TABLE_SCHEMA, TABLE_NAME)

FROM INFORMATION_SCHEMA.COLUMNS
WHERE IS_NULLABLE = 'YES'
  AND TABLE_NAME = ?        -- filter by table name
  AND TABLE_SCHEMA = ?;     -- filter by schema name

SELECT @sql;
EXEC(@sql);

db <>
fiddle演示

输出:

+---------------+-----------------+------------------+----------+--------------------+---------------+
| table_schema  |   table_name    | table_col_name   | row_num  | row_num_non_nulls  | row_num_nulls |
+---------------+-----------------+------------------+----------+--------------------+---------------+
| [dbo]         | [StudentScore]  | [Student_Name]   |       7  |                 6  |             1 |
| [dbo]         | [StudentScore]  | [Student_Score]  |       7  |                 5  |             2 |
+---------------+-----------------+------------------+----------+--------------------+---------------+


 类似资料:
  • 问题内容: 使用: 我有一张桌子: 还有其他一些表(大约还有200个表),其中一些用作上的外键。 因此,我想找出-哪些表使用此外键()? 我正在使用访问我的sql-server 。 问题答案: 在SQL Server Management Studio中,可以在对象资源管理器中右键单击表,然后选择“查看依赖项”。这将打开一个新窗口,您可以在其中查看依赖于表以及表所依赖的所有其他对象(不仅仅是表)。

  • 我试图找出我的表是否为空,但我得到了这个错误 调用未定义的函数App\Http\Controller\isempty() 我确实检查了一个与我的题目相似的问题,但没有我需要的。 这是我的密码

  • 如何在Python中找到列表的中值?列表可以是任何大小,并且不能保证数字按任何特定顺序排列。 如果列表包含偶数个元素,则函数应返回中间两个元素的平均值。 以下是一些示例(出于显示目的进行了分类):

  • 问题内容: 关于你的第一个问题:该代码非常好,并且如果与其中的一个元素相等就可以正常工作。也许你尝试查找与其中一项不完全匹配的字符串,或者你使用的浮点值会导致不准确。 关于第二个问题:如果“查找”列表中的内容,实际上有几种可能的方法。 检查里面是否有东西 这是你描述的用例:检查列表中是否包含某些内容。如你所知,你可以使用in运算符: 过滤集合 即,找到满足特定条件的序列中的所有元素。你可以为此使用

  • 如何找到python列表的中间位置? 这只是一个函数的例子,它可以找到任何列表的中间,你可以用列表理解来做这件事吗? 编辑:这与去掉中间点不同,因为我只想打印出中间值,如果列表是奇数,我想返回两个中间值,就像接受的答案一样。没有像另一个问题那样得到中值,而是得到两个值的平均值。

  • 问题内容: 要求 : 通用查询/函数,用于检查表的varchar列中提供的值是否实际上是数字,并且精度不超过允许的精度。 可用值: 表名称,列名称,允许的精度,允许的比例 一般建议是创建一个函数并使用to_number()来验证值,但是不会验证允许的长度(精度标度)。 我的解决方案: 使用Regexp验证号码 验证左部分的长度(十进制前)(我不知道它的实际名称是什么),因为对于小数位数,oracl