如何在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(
位仍在传递。有两种选择:
- 使用
.
连接:$query='insert Into tr_view(name,age,month,year) values (' . toDB($name) . ',' . toDB($age) . ',' . toDB($month) . ',' . toDB($year) . ')')
- 您可以将可调用变量插入到双引号字符串中:
$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 整数转换为位字符串?