为什么 postgres `CHECK` 约束中不可能有 IF 子句?

Why `IF` clause is not possible in postgres `CHECK` constraint?

例如这个查询是否可行?

CREATE TABLE products (
    name text,
    price numeric not null,
    CHECK (IF price > 0 THEN name IS NOT NULL ELSE name IS NULL END IF)
);

更新:

好像没有

此处https://rextester.com/l/postgresql_online_compiler

它抛出错误

Error(s), warning(s):

42601: syntax error at or near "price"

查看文档 https://www.postgresql.org/docs/current/sql-createtable.html#SQL-CREATETABLE-EXCLUDE 它说

Currently, CHECK expressions cannot contain subqueries nor refer to variables other than columns of the current row. The system column tableoid may be referenced, but not any other system column.

但是IF不是子查询,不明白为什么它不起作用


更新 2:

那个

CREATE TABLE products (
    name text,
    price numeric not null,
    CHECK ((price > 0 AND name IS NOT NULL) OR (price <= 0 AND name IS NULL))
);

可行,但以这种方式编写复杂查询会变得乏味

我不是 100% 理解你的问题,但我认为你是在说:

If the price > 0 then name CANNOT be NULL

在这种情况下应该这样做:

CHECK (price > 0 AND name IS NOT NULL)

如果 nameprice 为 0 时可以为 NULL,则使用此:

CHECK ((price > 0 AND name IS NOT NULL) OR (price = 0 AND name IS NULL))

您不需要在 CHECK 条件中指定 IF,它应该主要包含要测试的实际语句而不是 IF 语句。

IF 不是子查询,在 SQL 中也不是任何其他查询。所以它被假定为一个列名。有两个(假设的)列名紧挨着一行是一个语法错误,并被分配给第二个列名。

SQL 有 CASE,没有 IF。你需要使用你正在使用的语言,而不仅仅是编造你希望工作的东西。

CREATE TABLE products (
    name text,
    price numeric not null,
    CHECK (case when price > 0 THEN name IS NOT NULL ELSE name IS NULL END)
);