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

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

张光辉
2023-03-14
问题内容

我有一些类型为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...

为什么?


问题答案:

有NULLIF()功能:

SELECT NULLIF(var, '');

如果var保持$ 2中的值,则NULL取而代之。
在这个例子中我替换空字符串:’‘有NULL。

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

如果您没有定义默认列,则也可以在命令中省略该列,INSERT并将其填充为NULL(这是默认值DEFAULT)。

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

或者使用PHP文字NULL代替,如Quassnoi在此处演示的那样。

其余的仅对字符串类型有意义
为了绝对确定,没有人可以输入空字符串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();


 类似资料:
  • 问题内容: 我已经创建了一个自定义数据类型枚举,如下所示: 从外部数据源,我得到[0,4]范围内的整数。我想将这些整数转换为它们对应的枚举值。 我怎样才能做到这一点? 我正在使用PostgreSQL 8.4。 问题答案:

  • 问题内容: 我有此查询在MySQL中正常工作。这里有更多背景信息。 我尝试在PostgreSQL中运行它,但此错误消息失败。 PGError:错误:列“ c.name”必须出现在GROUP BY子句中或在聚合函数中使用 我不确定这是什么意思,所以我尝试在group by子句中将“ c.id”更改为“ c.name”(在MySQL中两者都是相同的,假定项的名称是唯一的)。 但是,这又产生了另一个类似

  • 更多信息: 我有一个hibernate存储库,如下所示- Hibernate以某种方式将(在where子句中)作为,而SAMPLE_TABLE将这个id字段作为,因此会引发类型不匹配问题。 字段在这里定义为long。 Edit-2如果有人得到这样的问题,很可能他在查询中传递了null值。

  • 我正在尝试将一个PostgreSQL表迁移到一个包含所有数据的MySQL,但由于有两列,我无法迁移。这些列在Postgresql表中作为布尔值,并且这些列中的值为TRUE或FALSE(看起来像字符串)。我在MySQL中创建了一个布尔列,但它不接受真/假数据。对于这些真/假值,我应该使用什么来代替布尔值?我尝试了tinyint(4),但它不起作用(我必须迁移数据,因为它是真的或假的,而不是t/f或1

  • 问题内容: 我是Java的新手,想知道double转换为int cast如何工作吗?我知道,只需将低32位转换为int就很容易了,但是将double(64位)转换为int(32位)呢?来自二进制的double中的那64位是Double- precision浮点格式(Mantissa),那么它如何在内部转换为int? 问题答案: 所有这些都记录在JLS的5.1.3节中。 第一步,将浮点数转换为lon

  • 问题内容: 我正在尝试以下查询: (+1.0仅用于强制转换浮动。我的实际查询要复杂得多,此查询只是问题的测试用例。) 我得到了错误: 如果我添加显式强制转换: 错误变为: 我知道大多数jsonb值不能转换为浮点数,但是在这种情况下,我知道纬度都是JSON编号。 是否有一个将jsonb值强制转换为浮点数(或为不可广播的返回NULL)的函数? 问题答案: 要从中获得价值,有两种操作。第一个将返回。第二