GVKun编程网logo

特定的合并sql中的2列,但其中之一除外(特定的合并sql中的2列,但其中之一除外怎么办)

19

最近很多小伙伴都在问特定的合并sql中的2列,但其中之一除外和特定的合并sql中的2列,但其中之一除外怎么办这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展CASE和COALESC

最近很多小伙伴都在问特定的合并sql中的2列,但其中之一除外特定的合并sql中的2列,但其中之一除外怎么办这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展CASE和COALESCE短路评估适用于PL / SQL中的序列,但不适用于SQL中的序列、C语言中的关键字:go是其中之一吗?、DataGridView不能聚焦,但是其中之一可以、line-height的其中之一作用等相关知识,下面开始了哦!

本文目录一览:

特定的合并sql中的2列,但其中之一除外(特定的合并sql中的2列,但其中之一除外怎么办)

特定的合并sql中的2列,但其中之一除外(特定的合并sql中的2列,但其中之一除外怎么办)

我有这样的表:

| user1 | user2 ||   1   |   2   ||   3   |   1   ||   4   |   1   ||   1   |   5   ||  ...  |  ...  |

我想将此列合并为一,但在新合并的列中必须为数字,这与给定的数字不相等。那就是如果我在上表中使用此查询并给出数字1:

SELECT CONCAT(user1, user2) AS user FROM table WHERE user1 = 1 or user2 = 1

我已经退货了:

| user ||  12  ||  31  ||  41  ||  15  ||  ..  |

什么时候应该返回此:

| user  ||   2   ||   3   ||   4   ||   5   ||  ...  |

1是一个示例。怎么做 ?

答案1

小编典典
SELECT IF(user1 = 1, user2, user1) AS userFROM tableWHERE user1 = 1 OR user2 = 1

CASE和COALESCE短路评估适用于PL / SQL中的序列,但不适用于SQL中的序列

CASE和COALESCE短路评估适用于PL / SQL中的序列,但不适用于SQL中的序列

是否在文档中所描述的短路评价CASECOALESCE()在SQL中使用时适用于序列?这似乎没有发生。

Oracle文档中CASE指出:

Oracle数据库使用短路评估。对于一个简单的CASE表达式…如果先前的compare_expr等于expr,则Oracle永远不会评估compare_expr。对于搜索的CASE表达式,如果以前的条件为true,则数据库…永远不会评估条件。

对于COALESCE()
文档,类似地指出:

Oracle数据库使用短路评估。数据库评估每个expr值并确定它是否为NULL,而不是在确定所有expr值是否为NULL之前先评估所有的expr值。

从SQL调用序列时,情况似乎并非如此。如您所见,没有短路发生,并且顺序增加了。

SQL> create sequence tmp_test_seq start with 1 increment by 1;SQL> select tmp_test_seq.nextval from dual;   NEXTVAL----------         1SQL> select tmp_test_seq.currval from dual;   CURRVAL----------         1SQL> select coalesce(1, tmp_test_seq.nextval) from dual;COALESCE(1,TMP_TEST_SEQ.NEXTVAL)--------------------------------                               1SQL> select tmp_test_seq.currval from dual;   CURRVAL----------         2SQL> select case when 1 = 1 then 1 else tmp_test_seq.nextval end as s from dual;         S----------         1SQL> select tmp_test_seq.currval from dual;   CURRVAL----------         3

SQL小提琴。

但是,从PL / SQL调用时,序列 增加:

SQL> create sequence tmp_test_seq start with 1 increment by 1;SQL> declare  2     i number;  3  begin  4     i := tmp_test_seq.nextval;  5     dbms_output.put_line(tmp_test_seq.currval);  6     i := coalesce(1, tmp_test_seq.nextval);  7     dbms_output.put_line(i);  8     dbms_output.put_line(tmp_test_seq.currval);  9     i := case when 1 = 1 then 1 else tmp_test_seq.nextval end; 10     dbms_output.put_line(i); 11     dbms_output.put_line(tmp_test_seq.currval); 12  end; 13  /11111SQL> select tmp_test_seq.nextval from dual;   NEXTVAL----------         2

从PL / SQL调用SQL中的序列与使用SQL产生相同的结果:

SQL> create sequence tmp_test_seq start with 1 increment by 1;SQL> declare  2     i number;  3  begin  4     select tmp_test_seq.nextval into i from dual;  5     dbms_output.put_line(tmp_test_seq.currval);  6     select coalesce(1, tmp_test_seq.nextval) into i from dual;  7     dbms_output.put_line(i);  8     dbms_output.put_line(tmp_test_seq.currval);  9     select case when 1 = 1 then 1 else tmp_test_seq.nextval end into i 10       from dual; 11     dbms_output.put_line(i); 12     dbms_output.put_line(tmp_test_seq.currval); 13  end; 14  /11213

文档中似乎没有关于此的任何内容。管理员管理序列导向,上序列psuedocolumns
SQL语言参考,关于和CURRVAL
NEXTVAL的PL /
SQL语言参考或数据库概念概述序列。

确实的短路评价CASECOALESCE()在SQL中使用时发生的序列?有文件记录吗?

如果感兴趣的话,我们就在11.2.0.3.5上。

答案1

小编典典

关于短路评估为何不适用于序列的原因的解释如下。什么是序列?抛开内部因素,它是序列定义(记录在seq$数据字典表中)和一些内部SGA组件的组合,它不是一个函数,可以考虑使用,尽管文档并未直接将其声明为行源(但执行计划中确实如此)。而且,每次在查询的选择列表中直接引用序列时,优化器在搜索最佳执行计划时都必须对其进行评估。在形成最佳执行计划的过程中,如果nextval引用伪列,则序列会递增:

SQL> create sequence seq1;Sequence created

这是我们的顺序:

SQL> select o.obj#  2       , o.name  3       , s.increment$  4       , s.minvalue  5       , s.maxvalue  6       , s.cache  7    from sys.seq$ s  8    join sys.obj$ o  9       on (o.obj# = s.obj#) 10    where o.name = ''SEQ1'' 11  ;      OBJ# NAME    INCREMENT$   MINVALUE   MAXVALUE      CACHE---------- ------- ---------- ---------- ---------- ----------     94442 SEQ1             1          1       1E28         20

让我们跟踪下面的查询,并查看其执行计划

SQL> ALTER SESSION SET EVENTS ''10046 trace name context forever, level 4'';Session alteredSQL> select case  2           when 1 = 1 then 1  3           when 2 = 1 then seq1.nextval  4         end as res  5    from dual;       RES----------         1/* sequence got incremented by 1 */SQL> select seq1.currval from dual;   CURRVAL----------         3

跟踪文件信息:

STAT#1016171528 id = 1 cnt = 1 pid = 0 pos = 1 obj = 94442 op =’SEQUENCE
SEQ1

STAT#1016171528 id = 2 cnt = 1 pid = 1 pos = 1 obj = 1 obj = 0 op =’FAST
DUAL
。 ..
CLOSE#1016171528:c = 0,e = 12,dep = 0,type = 0,tim = 12896600071500 /
关闭光标 /

执行计划将向我们展示基本相同的内容:

SQL> explain plan for select case  2                            when 1 = 1 then 1  3                            else seq1.nextval  4                          end  5                      from dual  6  /ExplainedExecuted in 0 secondsSQL> select * from table(dbms_xplan.display());PLAN_TABLE_OUTPUT---------------------------------------------------------------Plan hash value: 51561390-----------------------------------------------------------------| Id  | Operation        | Name | Rows  | Cost (%CPU)| Time     |-----------------------------------------------------------------|   0 | SELECT STATEMENT |      |     1 |     2   (0)| 00:00:01 ||   1 |  SEQUENCE        | SEQ1 |       |            |          ||   2 |   FAST DUAL      |      |     1 |     2   (0)| 00:00:01 |-----------------------------------------------------------------9 rows selectedExecuted in 0.172 seconds

在评估方面,直接在查询中引用序列,与包含相关子查询大致相同。 该关联的子查询将始终由优化器评估:

SQL> explain plan for select case  2                            when 1 = 1 then 1  3                            when 2 = 1 then (select 1  4                                               from dual)  5                          end as res  6                      from dual;ExplainedExecuted in 0 secondsSQL> select * from table(dbms_xplan.display());PLAN_TABLE_OUTPUT-----------------------------------------------------------------Plan hash value: 1317351201-----------------------------------------------------------------| Id  | Operation        | Name | Rows  | Cost (%CPU)| Time     |-----------------------------------------------------------------|   0 | SELECT STATEMENT |      |     1 |     4   (0)| 00:00:01 ||   1 |  FAST DUAL       |      |     1 |     2   (0)| 00:00:01 ||   2 |  FAST DUAL       |      |     1 |     2   (0)| 00:00:01 |-----------------------------------------------------------------9 rows selectedExecuted in 0.063 seconds

我们可以看到该dual表已经两次包含在执行计划中。

急于做出与子查询的类比。当然,区别多于相似。序列是绝对不同的机制。但是,优化器将序列视为行源,并且只要nextvalselect顶级查询列表中看不到直接引用序列的伪列,它就不会评估该序列,否则无论是否使用短路评估逻辑,该序列都将递增。显然,PL
/ SQL引擎(从Oracle 11g r1开始)具有访问序列值的不同方法。应该注意的是,在以前的11gR1版本的RDBMS中,我们应该编写查询以引用PL
/ SQL块中的序列,PL / SQL引擎将其直接发送到SQL引擎。

关于“ 为什么序列在优化程序生成执行计划期间会增加 的问题”的答案在于序列的内部实现。

C语言中的关键字:go是其中之一吗?

C语言中的关键字:go是其中之一吗?

c语言中的关键字:go是其中之一吗?

C语言中的关键字:go是其中之一吗?

在学习C语言的过程中,我们不可避免地会碰到各种关键字,这些关键字在程序设计中扮演着重要的角色。而对于初学者来说,有时候会产生一些疑惑,比如有人可能会问,C语言中是否有关键字“go”呢?接下来,让我们一起来探究一下这个问题。

首先,我们需要明确一点,C语言是一种非常经典的编程语言,它的关键字是早已确定的,不会轻易改变。在C语言的标准中,并没有一个名为“go”的关键字。因此,我们不能在C语言程序中使用“go”作为关键字来定义标识符、变量或函数等。

为了更清晰地说明这一点,让我们通过具体的代码示例来展示,在C语言中使用关键字“go”会引发编译错误。下面是一个简单的C语言程序:

立即学习“C语言免费学习笔记(深入)”;

#include <stdio.h>

int main() {
    int go = 10;
    printf("The value of go is: %d", go);
    return 0;
}
登录后复制

当我们尝试编译上述代码时,编译器将会报错,提示“error: expected identifier or ‘(’ before ‘=’ token”。这是因为在C语言中,“go”被视为一个非法的标识符,无法作为变量名使用。

在编程中,关键字是具有特殊含义的保留字,它们通常用于声明变量类型、控制程序流程等。C语言中已经定义了一系列固定的关键字,包括“int”、 “if”、 “while”等,这些关键字是编译器识别并处理的重要部分,而“go”并不在其中。

尽管C语言中没有关键字“go”,但在其他编程语言中,比如Go语言(也称为Golang),“go”是一个重要的关键字,用于启动一个新的goroutine,实现并发编程。因此,对于想要使用“go”关键字的开发者,可以考虑学习和使用Go语言。

总的来说,C语言中并没有关键字“go”,在编写C语言程序时需要遵守C语言的规范,不得随意使用非法的标识符。希望通过本文的解释和代码示例能帮助读者更好地理解C语言中的关键字,避免出现不必要的错误。

(注:以上代码仅为示例,编译或运行结果可能因环境和设置而有所不同。)

以上就是C语言中的关键字:go是其中之一吗?的详细内容,更多请关注php中文网其它相关文章!

DataGridView不能聚焦,但是其中之一可以

DataGridView不能聚焦,但是其中之一可以

如何解决DataGridView不能聚焦,但是其中之一可以?

| 我遇到了与Windows窗体中的DataGridViews有关的最奇怪的错误。 我有一个TabControl,应该在每个标签页中包含一个停靠的DataGridView。我认为将网格集中在更改选项卡页面上会很方便,以便用户只需将鼠标悬停在网格上并在更改页面时开始滚动即可。因此,我只是在事件处理程序中放入“ 0”来更改选项卡页。 但是,确实发生了一些奇怪的事情。在我的测试应用程序中,我有三个标签页。如果我在启动应用程序后立即尝试滚动网格,则无法正常工作;我必须先单击网格。我期望如此。但是,如果更改选项卡页,除非单击第一个网格,否则我无法滚动其他网格! 因此,如果我将页面切换到第二页,然后又切换回第一页,则无需单击即可自动滚动该网格,但是如果我切换到第三页,则必须单击以使网格聚焦。 我看了一下网格的
CanFocus
属性,似乎只有第一个网格将其设置为True。它们都是以编程方式创建的,并且都以相同的方式创建。我不明白他们为什么会有所不同。 有任何想法吗?     

解决方法

        不活动的标签页的Visible属性设置为false。 CanFocus的文档说:   为了让控件接收   输入焦点时,控件必须有一个   分配给它的句柄,以及可见   和Enabled属性必须都是   控件和控件均设置为true   所有其父控件     ,        好吧,我解决了。我这是愚蠢的编程错误,我只有
grids[tabs.TabIndex].Focus()
而不是
grids[tabs.SelectedIndex].Focus()
。 那好吧。     

line-height的其中之一作用

line-height的其中之一作用

html结构:

<div>
                    <p>月会员</p>
                    <p>¥XX</p>
                    <p>1个月</p>
                </div>

css结构:

.money-options {
  display: inline-block;
  width: 106px;
  height: 108px;
  /*line-height: 1;*/ /*没有line-height的时候*/
  margin-right: 10px;
  border: 1px solid #D7D7D7;
  border-radius: 8px;
  text-align: center;
}
.money-options .txt {
  padding: 18.5px 0 0 0;
  color: #656565;
  font-size: 13px;
}
.money-options .money {
  padding: 15.5px 0 18px 0;
  color: #F7B529;
  font-size: 20px;
}
.money-options .times {
  margin: 0 0 12.5px 0;
  color: #999999;
  font-size: 11px;
}

解释:
如果在一个div设置的高度而没有设置line-height,那么这个div里面的内容就会撑出去,加上line-height:1后,那么里面的padding就不会乱撑开,就会放在div里面了

今天关于特定的合并sql中的2列,但其中之一除外特定的合并sql中的2列,但其中之一除外怎么办的讲解已经结束,谢谢您的阅读,如果想了解更多关于CASE和COALESCE短路评估适用于PL / SQL中的序列,但不适用于SQL中的序列、C语言中的关键字:go是其中之一吗?、DataGridView不能聚焦,但是其中之一可以、line-height的其中之一作用的相关知识,请在本站搜索。

本文标签: