标签: coalesce

即使第一个参数不为 NULL,SQL Server 是否会读取所有 COALESCE 函数?

我正在使用 T-SQLCOALESCE函数,其中第一个参数在大约 95% 的运行时间不会为空。如果第一个参数是NULL,第二个参数是一个相当漫长的过程:

SELECT COALESCE(c.FirstName
                ,(SELECT TOP 1 b.FirstName
                  FROM TableA a 
                  JOIN TableB b ON .....)
                )
Run Code Online (Sandbox Code Playgroud)

例如,如果 ,c.FirstName = 'John'SQL Server 仍会运行子查询吗?

我知道使用 VB.NETIIF()函数,如果第二个参数为 True,代码仍会读取第三个参数(即使不会使用它)。

null sql-server coalesce

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

将元素插入表格时,“列引用不明确”

我使用 PostgreSQL 作为我的数据库。我需要在数据库中创建一个条目,如果它已经存在,只需更新其字段,但只有在未设置时才应更新其中一个字段。

我已经使用了这个问题的信息:https : //stackoverflow.com/questions/13305878/dont-update-column-if-update-value-is-null,它与我所拥有的非常相关。

我尝试使用此查询,但是当我运行它时,它会出错Column reference 'affiliate_code' is ambiguous

INSERT INTO accounts (id, token, affiliate_code)
VALUES (value1, value2, value3)
ON CONFLICT (id) DO
UPDATE SET token = value2,
  affiliate_code = COALESCE(affiliate_code, value3);
Run Code Online (Sandbox Code Playgroud)

(当然,实际值会被替换)。

如果我替换affiliate_code = COALESCE(affiliate_code, value3)affiliate_code = value3,一切正常,但不是我想要的方式。

我怎样才能使这项工作?

这是我的表的定义方式:

CREATE TABLE accounts (
  id VARCHAR NOT NULL UNIQUE,
  token VARCHAR NOT NULL,
  affiliate_code VARCHAR
);
Run Code Online (Sandbox Code Playgroud)

postgresql upsert coalesce

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

当没有匹配记录时,为什么 SELECTing sum() 返回 null 而不是 0?

这只是无数让我一直感到沮丧的小细节之一,迫使我记住各种特殊代码,并导致我的查询变得比应有的更难看。

尝试以下查询来获取大小:

SELECT sum(amount) FROM table WHERE conditions;
Run Code Online (Sandbox Code Playgroud)

如果它找不到sum()该数量的记录,它将返回空/空/未定义而不是 0,导致我的应用程序中的输出意外为空,而不是零的“总和”。但是sum()意味着“总和”,那么为什么不直接返回 0呢?

我知道解决方案。你“简单地”做:

SELECT COALESCE(sum(amount), 0) FROM table WHERE conditions;
Run Code Online (Sandbox Code Playgroud)

现在即使没有记录也会返回0。但它很丑,而且用起来不再感觉“有趣”。并不是说数据库应该是一个“有趣的游戏”,但你知道我的意思:如果查询变得过于复杂/“丑陋”,那么使用它就不再令人满意,特别是如果你知道这必须是在各种地方重复出现,这不仅仅是一些晦涩难懂的、一次性的边缘案例。

让它表现成这样的背后的思考过程是什么?我还有许多与 相关的其他问题null,但对于这个问题,我将重点关注这一件事。

postgresql null database-design coalesce

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

如何在相邻列中显示单独表的查询?

我有两个表 - 一个标题为“计划约束”的表,其中包含“sot_allowed”时间间隔,另一个标题为“计划”,其中包含“sot_contribution”时间间隔。

以下是两个表的架构(为便于阅读而进行了编辑):

                         Table "public.planning_constraints"
   Column    |           Type           |          Modifiers  
-------------+--------------------------+-------------------------------
 start_time  | timestamp with time zone | 
 end_time    | timestamp with time zone | 
 sot_allowed | interval                 | 

                         Table "public.planning"
      Column      |           Type           |         Modifiers          
------------------+--------------------------+----------------------------
 start_time       | timestamp with time zone | 
 end_time         | timestamp with time zone | 
 sot_contribution | interval                 | 
Run Code Online (Sandbox Code Playgroud)

我可以分别查询它们并生成我想要的总数。“planning_constraints”表的查询是:

SELECT
  date_trunc('day', start_time - INTERVAL '18 hours')::date AS planning_day,
  sum(sot_allowed) AS minutes_allowed
FROM planning_constraints
WHERE start_time>='2016-11-26 18:00:00+00' AND start_time<'2016-12-03 18:00:00+00' AND comment like …
Run Code Online (Sandbox Code Playgroud)

postgresql join datetime sum coalesce

5
推荐指数
1
解决办法
108
查看次数

Postgres 不返回有关 array_agg 查询的数据,如下所示

当特定图书馆中没有书籍数据时,就会出现问题。考虑以下工作场景。

桌子 library

--------------------------------
| id |    name     |    owner  |
--------------------------------
|  1 |     ABC     |     A     |
|  2 |     DEF     |     D     |
|  3 |     GHI     |     G     |
--------------------------------
Run Code Online (Sandbox Code Playgroud)

桌子 books

--------------------------------
| id |    title    |  library  |
--------------------------------
|  a |     xxx     |     1     |
|  b |     yyy     |     1     |
|  c |     zzz     |     2     |
--------------------------------
Run Code Online (Sandbox Code Playgroud)

现在,当我进行如下查询时:

SELECT library.name, array_agg(b.title) AS book_list FROM library, 
(SELECT title FROM books WHERE …
Run Code Online (Sandbox Code Playgroud)

postgresql join array coalesce sqlalchemy

5
推荐指数
2
解决办法
312
查看次数

从一组值中选择最非默认的值

鉴于以下表格:

CREATE TABLE FeeTestClient (Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, Name VARCHAR(16))
INSERT INTO FeeTestClient (Name)
VALUES ('Test'), ('Test 2'), ('Test 3')

CREATE TABLE FeeTest (FeeId INT IDENTITY(1,1) NOT NULL PRIMARY KEY, ClientId INT, Fee INT, Val VARCHAR(16), Val2 VARCHAR(16))
INSERT INTO FeeTest (ClientId, Fee, Val, Val2)
VALUES (1, 15, 'Default', 'Default'),
       (1, 10, 'Default', 'asdf'),
       (2, 15, 'Default', 'Default'),
       (2, 20, 'Default', 'qwer'),
       (2, 10, 'zxcv', 'asdf'),
       (3, 20, 'Default', 'Default')
Run Code Online (Sandbox Code Playgroud)

我的目标是选择所有FeeTestClient元素,并选择最不默认的费用。在默认费的规则很简单:如果Val2是 …

join sql-server sql-server-2014 coalesce

4
推荐指数
1
解决办法
102
查看次数

为 WHERE COALESCE() 条件创建索引

我使用的是 PostgreSQL V9.6.11

表DDL:

CREATE TABLE test_c ( 
          insrt_prcs_id bigint NOT NULL, 
          updt_prcs_id bigint, src_sys_id integer NOT NULL,
          load_dttm timestamp(6) with time zone NOT NULL, 
          updt_dttm timestamp(6) without time zone);

Run Code Online (Sandbox Code Playgroud)

我试图index为下面的查询创建一个:

SELECT * 
FROM test_c             
WHERE COALESCE(u_dttm,l_dttm) > '2020-04-10 15:29:44.596311-07'
AND   COALESCE(u_dttm,l_dttm) <= '2020-04-11 15:29:44.596311-07' 
Run Code Online (Sandbox Code Playgroud)

创建index为:

create index idx_test_c  on test_c(COALESCE((updt_dttm, load_dttm)))
Run Code Online (Sandbox Code Playgroud)

但查询计划器没有扫描索引:

EXPLAIN ANALYZE
SELECT *            
FROM test_c             
WHERE COALESCE(u_dttm,l_dttm) > '2020-04-10 15:29:44.596311-07'
AND   COALESCE(u_dttm,l_dttm) <= '2020-04-11 15:29:44.596311-07' 
Run Code Online (Sandbox Code Playgroud)
Seq Scan on test_c as test_c (cost=0..1857.08 …
Run Code Online (Sandbox Code Playgroud)

postgresql index coalesce postgresql-9.6

4
推荐指数
1
解决办法
6460
查看次数

为什么 COALESCE 函数对此查询不起作用?

我正在尝试计算从子查询中检索的列数,并且某些子查询可能为空。因此,我不想将其显示为空单元格,而是希望它为 0。发现我可以通过使用该COALESCE函数来做到这一点,但例如此查询仍然给我一个空单元格:

CREATE VIEW third_table AS 
SELECT * 
FROM  (second_table  
NATURAL FULL JOIN (
   SELECT assignment_id, COALESCE( count(*), 0 ) AS num_60_79 
   FROM (
      SELECT assignment_id, mark_as_percent 
      FROM avg_required_table
      WHERE mark_as_percent >= 60 
      AND mark_as_percent < 80
      ) a 
   GROUP BY assignment_id
   ) b);
Run Code Online (Sandbox Code Playgroud)

这是COALESCE应该如何使用?

postgresql join subquery coalesce

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

MySQL Coalesce date 缺少结果,为什么?

运行 MySQL 8.0.16,据我所知,设置保留为默认值。

我有一张桌子,我们称之为 the_table,有列

id: bigint 主键 auto_increment

the_time:日期时间

我有一个记录,the_time 为 2019-12-19 00:00:00。

当我运行

SELECT id, the_time 
FROM the_table 
WHERE the_time BETWEEN '2019-12-19' AND '2019-12-19';

SELECT id, the_time 
FROM the_table 
WHERE COALESCE(the_time, DATE('9999-1-1')) BETWEEN '2019-12-19' AND '2019-12-19';
Run Code Online (Sandbox Code Playgroud)

我得到那个记录。然而,随着

SELECT id, the_time 
FROM the_table 
WHERE COALESCE(the_time, '9999-1-1') BETWEEN '2019-12-19' AND '2019-12-19';
Run Code Online (Sandbox Code Playgroud)

我没有,虽然将其更改为

SELECT id, the_time 
FROM the_table 
WHERE COALESCE(the_time, '9999-1-1') BETWEEN '2019-12-18' AND '2019-12-20';
Run Code Online (Sandbox Code Playgroud)

我突然又做了。为什么 MySQL 会这样?为什么额外的 DATE() 会有所作为?我原以为日期和字符串格式之间的转换是双射的,不应该影响计算,但似乎确实如此。为什么只是合并会对是否找到非空记录产生影响?

mysql date coalesce mysql-8.0

0
推荐指数
1
解决办法
719
查看次数