无论数据类型如何,检查给定数据是不是为非空?

Posted

技术标签:

【中文标题】无论数据类型如何,检查给定数据是不是为非空?【英文标题】:Check that a given data is non empty regardless of its data type?无论数据类型如何,检查给定数据是否为非空? 【发布时间】:2019-07-05 21:44:53 【问题描述】:

在 PostgreSQL 中有一种方法可以检查给定数据是否为非空,无论其数据类型如何。我认为以下内容不适用于所有数据类型:

    IF table.columnName IS NOT NULL THEN
    END IF;

【问题讨论】:

您认为is not null 会因null 值而失败?你说的“空”是什么意思? is not null 适用于所有数据类型。 is not null 也适用于 binary/blob/clob? 它适用于 所有 数据类型(尽管 Postgres 没有 clobblob 类型) 【参考方案1】:

IS NOT NULL 适用于所有数据类型。

来自manual:

比较运算符适用于所有相关数据类型。

【讨论】:

is not null 将适用于二进制/几何/数组以及所有 ?? 如果您的列可以为空并且您有 NULL 值,它将被排除在外。就那么简单。但是,NULL 并不意味着空。【参考方案2】:

对于基于字符的列,空字符串不为空。

要将空字符串转换为 NULL,您可以使用:http://www.postgresqltutorial.com/postgresql-nullif/

NULLIF(table.columnName, '')

根据您想要达到完美的疯狂程度,这里有您可以使用的其他资源。

PostgreSQL 提供三种主要的字符类型:character(n) 或 char(n)、character varying(n) 或 varchar(n) 和 text,其中 n 是一个正整数。

http://www.postgresqltutorial.com/postgresql-data-types/

对于所有其他类型,“NULL”是数据类型为空的唯一情况。

检查类型:How to get a list column names and datatype of a table in PostgreSQL?

SELECT
    "pg_attribute".attname                                                    as "Column",
    pg_catalog.format_type("pg_attribute".atttypid, "pg_attribute".atttypmod) as "Datatype",

    not("pg_attribute".attnotnull) AS "Nullable"
FROM
    pg_catalog.pg_attribute "pg_attribute"
WHERE
    "pg_attribute".attnum > 0
    AND NOT "pg_attribute".attisdropped
    AND "pg_attribute".attrelid = (
        SELECT "pg_class".oid
        FROM pg_catalog.pg_class "pg_class"
            LEFT JOIN pg_catalog.pg_namespace "pg_namespace" ON "pg_namespace".oid = "pg_class".relnamespace
        WHERE
            "pg_namespace".nspname = 'schema'
            AND "pg_class".relname = 'table'
    );

您可以调整以上内容以仅选择基于字符的类型。

要获取所有空字符串,这里是 Erwin 的一个函数,它为所有列提供空值:https://dba.stackexchange.com/questions/81966/check-whether-empty-strings-are-present-in-character-type-columns

CREATE OR REPLACE FUNCTION f_empty_status(_tbl regclass, _col colclass)
  RETURNS bool AS
$func$
DECLARE
   -- basic char types, possibly extend with citext, domains or custom types:
   _typ      CONSTANT regtype[] := 'text, bpchar, varchar, "\"char\""';
   _sql      text;
   _col_arr  text[];
   _null_arr bool[];
BEGIN

-- Build command
SELECT INTO _col_arr, _null_arr, _sql
       array_agg(s.col)
     , array_agg(s.attnotnull)
     , '
SELECT $1
      ,unnest($2)
      ,unnest(ARRAY [count('
              || string_agg(s.col, ' = '''' OR NULL), count(')
                                || ' = '''' OR NULL)])
      ,unnest($3)
FROM   ' || _tbl
FROM  (
   SELECT quote_ident(attname) AS col, attnotnull
   FROM   pg_attribute
   WHERE  attrelid = _tbl              -- valid, visible, legal table name 
   AND    attnum >= 1                  -- exclude tableoid & friends
   AND    NOT attisdropped             -- exclude dropped columns
-- AND    NOT attnotnull               -- include columns defined NOT NULL
   AND    atttypid = ANY(_typ)         -- only character types
   ORDER  BY attnum
   ) AS s;

-- Debug
-- RAISE NOTICE '%', _sql;

-- Execute
IF _sql IS NULL THEN
   -- do nothing, nothing to return
ELSE
   RETURN QUERY EXECUTE _sql
   USING  _tbl::text, _col_arr, _null_arr;
END IF;

END
$func$  LANGUAGE plpgsql;

【讨论】:

For all other types, "NULL" is the only case when the data type is empty - 我不确定我是否同意;一个零元素数组对我来说似乎很“空”,'empty'::int4range 也是如此,更不用说你可以构建一个没有任何内容的 JSON 值的所有方法...... 你是对的,你需要根据你期望遇到的情况添加更多的案例。但是如果你有 JSON,你可能会考虑使用 MongoDB。 PostgreSQL 不是为 JSON 构建的,即使它可以很好地处理它。

以上是关于无论数据类型如何,检查给定数据是不是为非空?的主要内容,如果未能解决你的问题,请参考以下文章

typescript 是不是能够理解数组是不是为非空并相应地推断某些数组方法的类型?

mysql中可以在表格没有输入任何数据的情况下设置字段为非空吗?

php 中 判断数组中是不是有值

如何在swagger codegen中处理多种响应/返回类型(204为空,400为非空等)?

如何确定字符串是不是为非空,而不仅仅是 Groovy 中的空格?

如何将空查询集指定为非空查询集:[] 到 [<object: hi>]