如何在PostgreSQL中将空转换为null?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在PostgreSQL中将空转换为null?相关的知识,希望对你有一定的参考价值。

我有一些列类型int,但值为空。所以我想在插入数据库时​​将empty转换为null。我用代码:

function toDB($string) 
    if ($string == '' || $string == "''") 
        return 'null';
     else 
        return "'$string'";
    


//age,month,year is type integer.
$name="Veo ve";
$age='10';
$month='';
$year='';
    $query="Insert Into tr_view(name,age,month,year) values (toDB($name),toDB($age),toDB($month),toDB($year))
 $db->setQuery($query);
 $result= $db->query();

但它显示错误:

 pg_query(): Query failed: ERROR: syntax error at or near "" LINE 153: toDB(10), ^ in...

为什么?

答案

虽然Erwin关于NULLIF的答案很棒,但它并没有解决你的语法错误。

我们来看看查询:

$query="Insert Into tr_view(name,age,month,year) values (toDB($name),toDB($age),toDB($month),toDB($year))

之前您定义了一个名为toDB的函数。不幸的是,你在这里使用的语法不是如何从双引号字符串中调用函数,所以curlies和toDB(位仍在传递。有两种选择:

  1. 使用.连接: $query='insert Into tr_view(name,age,month,year) values (' . toDB($name) . ',' . toDB($age) . ',' . toDB($month) . ',' . toDB($year) . ')')
  2. 您可以将可调用变量插入到双引号字符串中: $fn = 'toDB'; $query="Insert Into tr_view(name,age,month,year) values ($fn($name),$fn($age),$fn($month),$fn($year))";

第一个是明确和理智,第二个是模糊的陌生和彻头彻尾的疯狂。

但是,您仍然不应该像这样组装输入。你仍然可能容易受到SQL injection attacks的影响。你应该使用prepared statements with parameterized placeholders

Postgres扩展使用pg_prepare。它们具有明显的优势,例如,允许您传递php null,而不必担心所有的空检测和引用。

如果你坚持保持toDB原样,考虑添加一个pg_escape_函数,如pg_escape_string,到构建引用字符串的东西。

另一答案

NULLIF()功能:

SELECT NULLIF(var, '');

如果var保持2美元的价值,你会得到NULL。 在示例中,我用''替换空字符串:NULL

类型整数没有空字符串。只是不可能。由于NULLIF()无法切换数据类型,因此您必须使用PHP清理输入。

如果您没有定义列默认值,您也可以省略INSERT命令中的列,它将填充NULL(这是默认的DEFAULT)。

检查PHP中的参数是否为空,如果是,则不包括INSERT命令中的列。

或者使用PHP文字NULL,而不像Quassnoi演示here

The rest only makes sense for string types

为了绝对确定,没有人可以输入一个空字符串添加一个CHECK约束到表:

ALTER TABLE tr_view
ADD CONSTRAINT tr_view_age_not_empty CHECK (age <> '');

为避免由此引起的异常,您可以添加一个自动修复输入的触发器:

CREATE OR REPLACE FUNCTION trg_tr_view_avoid_empty()
  RETURNS trigger AS
$func$
BEGIN
   IF NEW.age = '' THEN
      NEW.age := NULL;
   END IF;

   IF NEW.month = '' THEN
      NEW.month := NULL;
   END IF;

   RETURN NEW;
END
$func$  LANGUAGE plpgsql

CREATE TRIGGER tr_view_avoid_empty
BEFORE INSERT OR UPDATE ON tr_view
FOR EACH ROW
WHEN (NEW.age = '' OR NEW.month = '')
EXECUTE PROCEDURE trg_tr_view_avoid_empty();

以上是关于如何在PostgreSQL中将空转换为null?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PostgreSQL 8.0.2 中将列表转换为数组

如何在 Python 中将(有些复杂的)Postgresql 语句转换为 SQLAlchemy ORM?

如何在 PostgreSQL 中将长 NUMERIC 整数转换为位字符串?

postgresql的copy命令如何将csv中的引号转换成null插入?

如何在ssis中将空白转换为null

处理空值,把 Null 值转换为实际值(coalesce,nvl 函数用法)