我正在使用 Postgres。val text NULL CHECK(val <> '')
使用(or varchar
) 和之间的存储或性能是否有任何显着差异val text NOT NULL
?文本不能为空。因此,空文本可以作为未设置的标记。但是,例如根据存储有什么不同吗?
我知道,我用空文本失去了 NULL 魔法,但这没关系。另一方面,我可以更轻松地导入应用程序,因为我不必处理NULL
. 它只是串入,串出。
我正在使用 Postgres。val text NULL CHECK(val <> '')
使用(or varchar
) 和之间的存储或性能是否有任何显着差异val text NOT NULL
?文本不能为空。因此,空文本可以作为未设置的标记。但是,例如根据存储有什么不同吗?
我知道,我用空文本失去了 NULL 魔法,但这没关系。另一方面,我可以更轻松地导入应用程序,因为我不必处理NULL
. 它只是串入,串出。
表 T 有这个字段
+---------------+--------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+-------------------+-----------------------------+
| updated | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+---------------+--------------+------+-----+-------------------+-----------------------------+
在 MySQL 5.7 中,更新记录和设置updated=null
会自动设置updated
为当前日期时间
UPDATE T SET ...,updated=null WHERE k=123
==>
+---------------------+
| updated |
+---------------------+
| 2022-01-05 22:52:05 |
+---------------------+
但是在 MySQL 8.0 中做同样的事情,给出
+---------------------+
| updated |
+---------------------+
| 0000-00-00 00:00:00 |
+---------------------+
我该如何解决这个问题,这是 MySQL 错误,还是新设置(或行为改变)?
我有以下 SQL 脚本:
CREATE temporary table if not EXISTS the_values (
key SERIAL,
value INTEGER NULL
);
insert into the_values(value) values (null),(1),(null),(2),(3),(4),(5),(6),(10),(null),(null);
select *
from the_values
where value not in (1,2,3,4,5,6,10);
我注意到查询:
select *
from the_values
where value not in (1,2,3,4,5,6,10);
不返回具有value
NULL 的行,这引起了我的注意。因此,我想知道为什么会这样。我对这种现象的技术方面更感兴趣,而不是明显的解决方案:
select *
from the_values
where value not in (1,2,3,4,5,6,10)
or value IS NULL;
我期望值的任何字段(如 orderNumber 或 customerNumber)我将设置为不可为空。
如果我期望该字段的值不为空,我是否也应该始终有一个不允许零长度字符串或仅空格字符串的约束?
DECLARE @SubDesc1 nvarchar(100)
SET @SubDesc1 = null
我想做这样的事情。
查询 1
SELECT *
From Table1
where Category = 'Category1'
AND [Description] ='ABC'
AND SubDescription1 IS NULL
OR SubDescription1 = @SubDesc1
查询 2
SELECT *
FROM Table1
WHERE Category = 'Category1'
AND [Description] ='ABC'
AND SubDescription1 = (Case WHEN @SubDesc1 IS NOT NULL
Then @SubDesc1
ELSE SubDescription1
END)
如果我的,他们都没有解决@SubDesc1 = 'def'
但是,它会让我记录在哪里SubDescription1 Is null
和SubDescription1 = 'def'
我怎样才能做到这一点?
解释问题的最简单方法是使用审计触发器。
但是,在插入时它会保存所有值,包括空值。我想过滤掉hstore(NEW.*)
. 最简单/最快的方法是什么?
来源:https ://github.com/2ndQuadrant/audit-trigger/blob/master/audit.sql#L134
audit_row.row_data = hstore(NEW.*) - excluded_cols;
这显然不起作用,但希望能解释答案的样子。
audit_row.row_data = hstore(hstore(NEW.*) FILTER (WHERE value IS NOT NULL)) - excluded_cols;
首选将回答不使用用户创建的函数,例如仅使用 Postgres 函数/运算符。
这适用于 >= PostgreSQL 11。
我正在寻找一个解决方案hstore
,而不是json
或jsonb
。json
具有或jsonb
可以包括的替代方式,但是hstore
是优选的。
我一直在写一些看起来像这样的查询:
SELECT
...
FROM table_a a
LEFT JOIN table_b b
ON b.id = a.id
LEFT JOIN table_c c
ON c.id = a.id
在这些查询中,只有一个连接可以成功。换句话说,来自的行与来自的行或来自的table_a
行匹配。table_b
table_c
在选择列表中,有一些基于连接成功的逻辑。我可以通过执行以下操作来测试它:
SELECT
CASE
WHEN b IS NULL THEN
-- do something
ELSE NULL
END
FROM table_a a
LEFT JOIN table_b b
ON b.id = a.id
LEFT JOIN table_c c
ON c.id = a.id
测试某行是否可用时,NULL
您可以在表达式中使用表别名IS NULL
,但它在表达式中无法按预期工作IS NOT NULL
。table_b
如果其中有不存在的列NULL
,则表达式table_b IS NOT NULL
将返回FALSE
。
但是,表达式将按预期NOT (table_b IS NULL)
返回。TRUE
为什么会这样?
我正在尝试使用 InnoDB 引擎将数据从文件插入到 MYSQL 8.0。
我正在使用这个查询:
LOAD DATA INFILE '/var/lib/mysql-files/item_new_1_4.dat'
INTO TABLE Item FIELDS TERMINATED BY '|';
我收到一条错误消息:
ERROR 1292 (22007) at line 1: Incorrect date value: 'NULL' for column 'i_rec_end_date' at row 1
该表是由该查询创建的:
CREATE TABLE IF NOT EXISTS Item(
i_item_sk integer ,
i_item_id char(16) NOT NULL,
i_rec_start_date date,
i_rec_end_date date,
i_item_desc varchar(200),
i_current_price decimal(7,2),
i_wholesale_cost decimal (7,2),
i_brand_id integer,
i_brand char(50),
i_class_id integer default ,
i_class char(50),
i_category_id integer,
i_category char(50),
i_manufact_id integer,
i_manufact char(50),
i_size char(20),
i_formulation char(20),
i_color char(20),
i_units char(10),
i_container char(10),
i_manager_id integer,
i_product_name char(50),
PRIMARY KEY (i_item_sk)
);
第1行的数据是:
1|AAAAAAAABAAAAAAA|1997-10-27|NULL|Powers will not get influences. Electoral ports should show low, annual chains. Now young visitors may pose now however final pages. Bitterly right children suit increasing, leading el|27.02|23.23|5003002|exportischolar #2|3|pop|5|Music|52|ableanti|N/A|3663peru009490160959|spring|Tsp|Unknown|6|ought|
连接运算符||
可以连接任何字符串类型的值,返回text
. 在 Postgres 中,每种类型都有一个文本表示,并且可以转换为text
. 因此,引用手册:
但是,字符串连接运算符 (
||
) 仍然接受非字符串输入,只要至少一个输入是字符串类型
有关的:
连接一个或多个NULL
值会产生结果NULL
。
test=# SELECT (text 'foo' || NULL) IS NULL
test-# , (text 'bar' || char '1' || NULL ) IS NULL
test-# , (NULL::bigint || text 'baz') IS NULL;
?column? | ?column? | ?column?
----------+----------+----------
t | t | t
是否可以连接 atext
和一个NULL
值并获得非空结果?
换句话说,这怎么可能?
test=# SELECT col IS NULL AS col_is_null
test-# , (text 'foo' || col) IS NULL AS result_is_null
test-# FROM tbl;
col_is_null | result_is_null
-------------+----------------
t | f
适用于任何 Postgres 版本。
我的一个客户偶然发现了这个,依靠结果是NULL
,我发现它很有趣,可以分享。
这是一个有点技巧的问题,因为我知道答案。
注意: CASE
或COALESCE
捕捉NULL
值通常是好的风格,但这不是这个问题的目的。这是关于与实际NULL
值的连接,使用连接运算符||
并且仍然得到非空结果。