标签: null

为什么 NOT IN 包含 NULL 的集合总是返回 FALSE/NULL?

我有一个查询(针对 Postgres 和 Informix),其中NOT IN包含一个子查询,该子查询在某些情况下返回NULL值,导致该子句(以及整个查询)无法返回任何内容。

理解这一点的最佳方式是什么?我认为NULL没有价值的东西,因此不希望查询失败,但显然这不是考虑NULL.

postgresql null query informix

21
推荐指数
1
解决办法
1万
查看次数

比较可以包含 NULLS 的列 - 有没有更优雅的方法?

我知道您无法将值与 NULL 进行比较并期望结果而不添加类似以下代码的内容...

SELECT
    *
FROM 
    A INNER JOIN 
    B ON A.ID = B.ID
WHERE
    A.STRING <> B.STRING OR (A.STRING IS NULL AND B.STRING IS NOT NULL) OR (A.STRING IS NOT NULL AND B.STRING IS NULL) OR 
    A.DT <> B.DT OR (A.DT IS NULL AND B.DT IS NOT NULL) OR (A.DT IS NOT NULL AND B.DT IS NULL) OR 
    A.B <> B.B OR (A.B IS NULL AND B.B IS NOT NULL) OR (A.B IS NOT NULL AND B.B IS NULL) …
Run Code Online (Sandbox Code Playgroud)

null sql-server

20
推荐指数
1
解决办法
1万
查看次数

如何在 CONCAT MySQL 中排除 NULL 值?

如果我有这个 - tadd 是Address表:

CONCAT(tadd.street_number, ' ',
            tadd.street_name,', ',
            tadd.apt_number,', ',
            tadd.city,', ',
            tadd.postal_code,', ',
            tadd.country) AS 'Address'
Run Code Online (Sandbox Code Playgroud)

如果 apt_number 不存在,有没有办法排除它?

我在想:

WHERE tadd.apt_number IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

但它只会返回那些带有apt_number, 的行,即使某些东西有效,我该如何处理那个额外的逗号。

如果是重复的,请在评论中发布链接。

mysql null concat

20
推荐指数
2
解决办法
7万
查看次数

带有 NULL 值的 PostgreSQL UPSERT 问题

我在 Postgres 9.5 中使用新的 UPSERT 功能时遇到问题

我有一个表,用于从另一个表聚合数据。复合键由 20 列组成,其中 10 列可以为空。下面我创建了我遇到的问题的较小版本,特别是 NULL 值。

CREATE TABLE public.test_upsert (
upsert_id serial,
name character varying(32) NOT NULL,
status integer NOT NULL,
test_field text,
identifier character varying(255),
count integer,
CONSTRAINT upsert_id_pkey PRIMARY KEY (upsert_id),
CONSTRAINT test_upsert_name_status_test_field_key UNIQUE (name, status, test_field)
);
Run Code Online (Sandbox Code Playgroud)

根据需要运行此查询(首先插入,然后插入只会增加计数):

INSERT INTO test_upsert as tu(name,status,test_field,identifier, count) 
VALUES ('shaun',1,'test value','ident', 1)
ON CONFLICT (name,status,test_field) DO UPDATE set count = tu.count + 1 
where tu.name = 'shaun' AND tu.status = 1 AND tu.test_field = …
Run Code Online (Sandbox Code Playgroud)

postgresql null upsert unique-constraint postgresql-9.5

20
推荐指数
2
解决办法
2万
查看次数

在 PostgreSQL 中查找表的空列

什么查询会返回所有行都为 NULL 的表的列名?

schema postgresql null database-design

18
推荐指数
3
解决办法
2万
查看次数

测试是否有任何列为 NULL

我试图找出一个简单的查询,我可以做一个简单的查询来测试一个大表是否有一个条目列表,在任何列中至少有一个空白(NULL/空)值。

我需要类似的东西

SELECT * FROM table AS t WHERE ANY(t.* IS NULL)
Run Code Online (Sandbox Code Playgroud)

我不想做

SELECT * FROM table AS t WHERE t.c1 = NULL OR t.c2 = NULL OR t.c3 = NULL
Run Code Online (Sandbox Code Playgroud)

这将是一个巨大的查询。

sql-server-2008 null sql-server

18
推荐指数
3
解决办法
12万
查看次数

即使零行匹配,也让 SELECT 返回一个常量值

考虑这个选择语句:

SELECT *, 
       1 AS query_id 
FROM players 
WHERE username='foobar';
Run Code Online (Sandbox Code Playgroud)

它返回query_id带有值的列1以及玩家的其他列。

如何将一个至少让上面的SQL回报query_id1,即使选择,反而找不到行那场比赛?

顺便说一句,它是 PostgreSQL 8.4。

postgresql null select

18
推荐指数
2
解决办法
9万
查看次数

为什么 NOT NULL 计算列在视图中被认为可以为空?

我有一张桌子:

CREATE TABLE [dbo].[Realty](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [RankingBonus] [int] NOT NULL,
    [Ranking]  AS ([Id]+[RankingBonus]) PERSISTED NOT NULL
    ....
)
Run Code Online (Sandbox Code Playgroud)

还有一个观点:

CREATE View  [dbo].[FilteredRealty] AS
 SELECT 
realty.Id as realtyId,
...
COALESCE(realty.Wgs84X, ruian_cobce.Wgs84X, ruian_obec.Wgs84X) as Wgs84X,
COALESCE(realty.Wgs84Y, ruian_cobce.Wgs84Y, ruian_obec.Wgs84Y) as Wgs84Y,
realty.Ranking,
...
FROM realty
JOIN Category ON realty.CategoryId = Category.Id
LEFT JOIN ruian_cobce ON realty.cobceId = ruian_cobce.cobce_kod
LEFT JOIN ruian_obec ON realty.obecId = ruian_obec.obec_kod
LEFT JOIN okres ON realty.okresId = okres.okres_kod
LEFT JOIN ExternFile ON realty.Id = ExternFile.ForeignId AND …
Run Code Online (Sandbox Code Playgroud)

null sql-server view computed-column

17
推荐指数
2
解决办法
8741
查看次数

PostgreSQL 中的 (x IS NOT NULL) 与 (NOT x IS NULL)

为什么x IS NOT NULL不等于NOT x IS NULL

这段代码:

CREATE TABLE bug_test (
    id int,
    name text
);

INSERT INTO bug_test
VALUES (1, NULL);

DO $$
DECLARE
    v_bug_test bug_test;
BEGIN
    RAISE NOTICE '%: %', v_bug_test, (v_bug_test IS NULL);
    RAISE NOTICE '%: %', v_bug_test, (v_bug_test IS NOT NULL);
    RAISE NOTICE '%: %', v_bug_test, (NOT v_bug_test IS NULL);

    SELECT *
    INTO v_bug_test
    FROM bug_test
    WHERE id = 1;

    RAISE NOTICE '%: %', v_bug_test, (v_bug_test IS NULL);
    RAISE NOTICE '%: …
Run Code Online (Sandbox Code Playgroud)

postgresql null

17
推荐指数
1
解决办法
3269
查看次数

SQL Server - 向现有表添加不可为空的列 - SSDT 发布

由于业务逻辑,我们需要在表中添加一个新列,以确保始终填充该列。因此,应将其添加到表中NOT NULL。与之前解释如何手动执行此操作的问题不同,这需要由 SSDT 发布管理。

由于一些认识,我一直在用头撞墙一段时间来完成这个听起来简单的任务:

  1. 默认值不合适,不能是计算列。也许它是一个外键列,但对于其他列,我们不能使用像 0 或 -1 这样的假值,因为这些值可能具有重要意义(例如数字数据)。
  2. 在预部署脚本中添加列将在第二次自动尝试创建同一列时发布失败(即使预部署脚本被编写为幂等)(这真的很糟糕,否则我可以想一个简单的解决方案)
  3. 每次发生 SSDT 架构刷新时,在部署后脚本中将列更改为 NOT NULL 将被恢复(因此,至少我们的代码库将在源代码控制和服务器上的实际内容之间不匹配)
  4. 现在将列添加为可空,以便将来更改为 NOT NULL 在源代码管理中的多个分支/分支中不起作用,因为目标系统在下次升级时不一定都具有相同状态的表(并不是说这无论如何都是一个好方法 IMO)

我听别人说的方法是直接更新表定义(这样schema刷新是一致的),写一个预部署脚本,表的全部内容移动到一个包含新列填充逻辑的临时表,然后移动后部署脚本中的行。尽管如此,这似乎很危险,并且当它检测到一个 NOT NULL 列被添加到一个包含现有数据的表中时仍然会激怒发布预览(因为验证在预部署脚本之前运行)。

我应该如何添加一个新的、不可为空的列,而不会冒孤立数据的风险,或者在每次发布时使用固有风险的冗长迁移脚本来回移动数据?

谢谢。

null sql-server scripting ssdt

16
推荐指数
1
解决办法
5510
查看次数