Проверить, что данные не пусты независимо от их типа данных? - PullRequest
0 голосов
/ 12 февраля 2019

В PostgreSQL есть способ проверить, что данные не пусты, независимо от их типа.Я не думаю, что следующие будут работать для всех типов данных:

    IF table.columnName IS NOT NULL THEN
    END IF;

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

В случае символьного столбца пустая строка НЕ ​​НУЛЬ.

Чтобы превратить пустую строку в НУЛЬ, вы можете использовать: http://www.postgresqltutorial.com/postgresql-nullif/

NULLIF(table.columnName, '')

В зависимости отнасколько безумно вы хотите достичь совершенства, вот дополнительные ресурсы, которые вы можете использовать.

PostgreSQL предоставляет три основных типа символов: символ (n) или символ (n), символ варьирования (n) или varchar (n)и текст, где n - положительное целое число.

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

Для всех других типов «NULL» является единственным случаем, когда тип данных пуст.

Для проверки типа: Какполучить имена столбцов списка и тип данных таблицы в 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'
    );

Вы можете настроить вышеприведенное, чтобы выбрать только символьные типы.

Чтобы получить все пустые строки,Вот функция Эрвина, которая выдает все столбцы с пустыми значениями: 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;
0 голосов
/ 12 февраля 2019

IS NOT NULL работает со всеми типами данных.

Из руководства :

Операторы сравнения доступны для всех соответствующих типов данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...