AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 233522
Accepted
Erwin Brandstetter
Erwin Brandstetter
Asked: 2019-03-30 07:26:20 +0800 CST2019-03-30 07:26:20 +0800 CST 2019-03-30 07:26:20 +0800 CST

文本和 NULL 值的连接如何返回非空结果?

  • 772

断言 1

连接运算符||可以连接任何字符串类型的值,返回text. 在 Postgres 中,每种类型都有一个文本表示,并且可以转换为text. 因此,引用手册:

但是,字符串连接运算符 ( ||) 仍然接受非字符串输入,只要至少一个输入是字符串类型

有关的:

  • 如何连接 Postgres SELECT 中的列?

断言 2

连接一个或多个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值的连接,使用连接运算符||并且仍然得到非空结果。

postgresql null
  • 2 2 个回答
  • 2770 Views

2 个回答

  • Voted
  1. Best Answer
    filiprem
    2019-03-30T10:19:58+08:002019-03-30T10:19:58+08:00

    那是因为 PostgreSQL 中的 CAST 数组类型系统有点奇怪(乍一看):-)

    text || text[]使双方都被强制为数组。

    CREATE TABLE tbl (col text ARRAY);
    
    INSERT INTO tbl SELECT NULL;
    
    SELECT col IS NULL AS col_is_null,
      (text 'foo' || col) IS NULL AS result_is_null
      FROM tbl;
    
     col_is_null | result_is_null 
    -------------+----------------
     t           | f
    (1 row)
    

    另一个可能更能说明问题的例子:

    create temp table x as select 'foo' test, null::text[] col; 
    SELECT test, col, test || col from x;
     test | col  | ?column? 
    ------+------+----------
     foo  | NULL | {foo}
    (1 row)
    
    • 7
  2. Vérace
    2019-03-30T09:50:16+08:002019-03-30T09:50:16+08:00

    Question Is it possible to concatenate a text and a NULL value and get a non-null result?

    回答,是的!

    使用嵌套CASE 语句(感谢Craig Ringer):

    CREATE TABLE null_test
    (
      f1 TEXT,
      f2 INTEGER
    
    );
    
    INSERT INTO null_test VALUES ('foo', null);
    INSERT INTO null_test VALUES (null, null);
    

    询问:

    SELECT 
      '*_' || COALESCE(f1, '') || '_*' AS "Check",
      '*_' || 
      CASE 
        WHEN f2 IS NULL THEN
          CASE
            WHEN COALESCE(f2, 0) = 0 THEN ''
          END
       END || '_*' AS test_1,
      '*_' ||  
      COALESCE(f1, '') ||
      CASE 
        WHEN f2 IS NULL THEN
          CASE
            WHEN COALESCE(f2, 0) = 0 THEN ''
          END
       END || '_*' AS test_2,
       '*_' ||
       LENGTH
       (    
         COALESCE(f1, '') ||
         CASE 
           WHEN f2 IS NULL THEN
             CASE
               WHEN COALESCE(f2, 0) = 0 THEN ''
             END
         END
       ) || '_*' AS test_3     
    FROM null_test;
    

    结果('*_和'_*'是为了更清楚地看到发生了什么!):

    Check   test_1  test_2  test_3
    *_foo_* *__*    *_foo_* *_3_*
    *__*    *__*    *__*    *_0_*
    
    • 0

相关问题

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • 默认为 NULL 还是 NOT NULL?

  • 何时使用 NULL 以及何时使用空字符串?

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve