小编Pan*_*tea的帖子

接收字符输入并返回日期格式的函数(输入不正确)

我需要编写一个函数来接收字符串字符并返回日期格式。例如输入是 20120101,我需要这个 2012-01-01。问题是可能存在一些不正确的输入,例如“2012ABCD”。在这种情况下,我希望函数返回一个固定日期,例如 2020-01-01。到目前为止我写的是:

Create Function ReturnDate
(@date varchar(8))

Returns date

  as

    begin
       declare @result date

          set @result = (select convert(date , @date,111))
                if(@@ROWCOUNT>0) return @result
                 else return '2020-01-01'
       return @result
    end
Run Code Online (Sandbox Code Playgroud)

这不起作用,我只是不知道如何处理第二部分(当输入不正确时)。

sql-server t-sql functions

10
推荐指数
1
解决办法
305
查看次数

逻辑运算符使用不当导致查询性能不佳

我有一个包含大量数据(近 1500 万)且结构如下的表。

create table test
(a int,--> /* There is a normal index on this column */
 b int,
<other columns>)
Run Code Online (Sandbox Code Playgroud)

有一个从此表中进行选择的查询,其中 where 子句中的条件之一是:

where a!=1 or (a=1 and b!=0) /* The original condition */
Run Code Online (Sandbox Code Playgroud)

查询非常慢,我认为这种糟糕的性能大部分可能是由于逻辑运算符使用不当造成的。我已经改变了条件,如下所示:

where not (a=1 and b=0) /* The edited version*/
Run Code Online (Sandbox Code Playgroud)

并且性能发生了巨大的变化!我需要确定的是这两个条件完全相同,这样我就不会错过任何数据。我想知道您是否可以帮助我解决这个问题并告诉我您是否有更好的选择来治疗这种情况。

如果您知道任何有关逻辑运算的正确使用以及/顺序优化器处理它们的方式的文章,请分享链接。

提前致谢

sql-server query t-sql sql-server-2016 query-performance

8
推荐指数
1
解决办法
2241
查看次数

多个join的SQL查询执行计划的逻辑顺序

我知道执行 SQL 查询的逻辑顺序是:

FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE or WITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
Run Code Online (Sandbox Code Playgroud)

如果查询中有多个连接会发生什么,例如,如果我们有这样的查询:

SELECT *
FROM user_branch T1
INNER JOIN dimcustomer2 T2
   ON T1.BRANCH_CODE = T2.BRANCH_CODE
INNER JOIN customer_guarantee T3
   ON T3.CUSTOMER_NUM = T2.CUSTOMER_NUM
Run Code Online (Sandbox Code Playgroud)

一些示例数据:

customer_guarantee:    CUSTOMER_NUM      BRANCH_CODE
                      -------------------------------
                           A                X
                           B                X
                           C                Y
                           D                Z



 user_branch:           USER_ID          BRANCH_CODE    
                      --------------------------------
                           U1               Y



 dimcustomer2:         CUSTOMER_NUM      BRANCH_CODE      
                      --------------------------------
                           A                Y
                           B                Y
                           C                Y
                           D                Z
Run Code Online (Sandbox Code Playgroud)

这将如何执行?哪个连接会先执行?如果查询中有不同类型的连接怎么办?在这种情况下执行连接的顺序是什么?提前致谢。

query t-sql sql-server-2016

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

编写一个 T-SQL 存储过程接收 4 个数字并将它们插入到一个表中

我需要编写一个存储过程来接收 4 个数字并将它们插入一个表中。这是我迄今为止开发的:

Declare   
@1  Int = 10,
@2  Int = 20,
@3  Int = 30,
@4  Int = 40


Create table #Temp(Num int)
Declare @I char(1) = 1


 While (@I <= 4)
   Begin

         Insert Into #Temp
         Select @I

     SET @I +=1
   end


Select * from #Temp
Drop table #Temp
Run Code Online (Sandbox Code Playgroud)

我知道我可以直接和静态地将输入插入表中,但我只想知道有没有更好的方法来做到这一点?我想使用一个while语句,但问题是 (I) 变量的数字被插入到表中!!我的意思是输出是 1,2,3,4; 我想要的是 10、20、30、40。

sql-server stored-procedures t-sql

5
推荐指数
3
解决办法
2289
查看次数

PL/SQL 函数接收一个数字并返回其二进制格式

我正在尝试编写一个函数来接收一个数字并返回其二进制格式。这是我迄今为止开发的内容,它可以用于输入:4,8,16 但它不会为其他数字返回正确的二进制格式。我找不到问题,我想知道你是否能找到问题?

create or replace function Show_Binary(i_Number in Number) Return Varchar2 
  AS

     V_Binary varchar2(50) := '';
     i_Number2 Number := i_Number;
       Begin
         While i_Number2>=2 LOOP

          V_Binary := V_Binary || Remainder(i_Number2, 2);
          i_Number2 := i_Number2 / 2;

       End LOOP;
          V_Binary := V_Binary || TO_CHAR(i_Number2);
          select reverse (V_Binary) into V_Binary from dual;
      return (V_Binary);
   End;
Run Code Online (Sandbox Code Playgroud)

oracle oracle-11g plsql

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

如何根据查询中的列创建 100 的间隔?

我有一个结构如下的表:

create table item_test
(item_id       varchar2(10),
 item_row      number)
Run Code Online (Sandbox Code Playgroud)

示例数据如下所示,请注意Item_Row列中的数字从 1 开始,然后加 1 到没有任何间隙的数字。我需要做的是([1-100] , [101-200] , [201-300] ,......)为每个创建 100 的间隔Item_Id

   Item_Id       Item_Row    
 ------------   ----------- 
    A               1           
    A               2            
    A              ...
    A              ...
    A              236  /* Item_Row starts from 1 and continues to 236 */

    B               1
    B              ...
    B              ...
    B              173  /* Item_Row starts from 1 and continues to 173 */
    
    C               1
    C               2
    C              ...
    C              ...
    C              300  /* Item_Row …
Run Code Online (Sandbox Code Playgroud)

oracle oracle-11g-r2

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

仅对 ORDER BY 子句中的第一列进行排序

似乎我误解了“订购”的概念。

我有一个包含这种结构和数据的表:

CREATE TABLE TestTest (Value1 Int, Value2 Int);

INSERT INTO TestTest VALUES
(1, 10),
(2, 9),
(3, 8),
(4, 7),
(5, 6),
(6, 5),
(7, 4),
(8, 3),
(9, 2),
(10, 1)
;
Run Code Online (Sandbox Code Playgroud)

使用以下查询:

Select Value1 , Value2
from TestTest
order by Value1 desc,Value2 desc
Run Code Online (Sandbox Code Playgroud)

我期望两列Value1Value2从 10 到 1,因为我DESC用于两列。

但我看到这个输出:

Value1 按降序排列,Value2 不

为什么不是Value2降序排列?

sql-server order-by t-sql

4
推荐指数
3
解决办法
3524
查看次数

为什么更改窗口函数“MAX() OVER()”的ORDER BY部分中的列会影响最终结果?

我有一个具有以下结构的表,它是数据:

create table test_table
(
Item_index   int,
Item_name    varchar(50)
)

insert into test_table (Item_index,Item_name) values (0,'A')
insert into test_table (Item_index,Item_name) values (1,'B')
insert into test_table (Item_index,Item_name) values (0,'C')
insert into test_table (Item_index,Item_name) values (1,'D')
insert into test_table (Item_index,Item_name) values (0,'E')
Run Code Online (Sandbox Code Playgroud)

我想知道为什么更改order by查询部分中的列会更改结果?在QUERY-1, I useditem_indexQUERY-2I useditem_name列中按部分顺序排列。我认为这两个查询必须生成相同的结果because I used item_index in both queries for partitioning!我现在完全困惑了!为什么按列排序会影响最终结果?

查询-1:

select t.*,
       max(t.Item_name)over(partition by t.item_index order by item_index) new_column
from test_table t;
Run Code Online (Sandbox Code Playgroud)

结果:

Item_index …
Run Code Online (Sandbox Code Playgroud)

sql-server query t-sql window-functions sql-server-2016

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

使用绑定变量时如何解决错误“ORA:01-006:绑定变量不存在”?

我有一个包含以下结构和数据的表:

create table TEST_TABLE
(
  item_number NUMBER,
  item_name   VARCHAR2(50),
  item_col    VARCHAR2(50),
  item_pol    VARCHAR2(50)
)
Run Code Online (Sandbox Code Playgroud)

样本数据:

item_number |  item_name|  item_col |  item_pol
------------------------------------------------
     1      |   blue    |     b     |   c
     2      |   red     |     d     |   a
     3      |   black   |     e     |   a
     4      |   yellow  |     d     |   b
Run Code Online (Sandbox Code Playgroud)

这是我尝试使用的示例过程bind variables

create or replace procedure test_bind_variable(res         out sys_refcursor,
                                               item_number varchar2,
                                               item_name   varchar2,
                                               item_col    varchar2,
                                               item_pol    varchar2) is

  qry varchar2(8000);

begin

  qry := 'select * from test_table where …
Run Code Online (Sandbox Code Playgroud)

oracle query oracle-11g-r2 plsql error-handling

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

当列有数据时 NVL(&lt;Column_name&gt;,Sequence.nextval) 的奇怪行为?

我创建了一个这样的序列:

CREATE SEQUENCE seq_test2
  MINVALUE 0
  MAXVALUE 999999999999999999999999999
  START WITH 0
  INCREMENT BY 1;
Run Code Online (Sandbox Code Playgroud)

这两个查询都显示数字 0:

 select SEQ_TEST2.nextval from DUAL;   
 select SEQ_TEST2.currval from DUAL;
Run Code Online (Sandbox Code Playgroud)

我有一张桌子,你可以在这里看到:

create table STUDENT
(
  st_id      NUMBER,
  first_name VARCHAR2(150),
  last_name  VARCHAR2(150)
)
Run Code Online (Sandbox Code Playgroud)

执行下面的查询后,

select t.st_id , nvl(t.st_id , seq_test2.nextval) as seq
from STUDENT t
Run Code Online (Sandbox Code Playgroud)

当列中没有空值时st_id,我得到的结果是这样的:

    st_id    seq
   ---------------
      1       1
      2       2
      3       3
      4       4
      5       5
Run Code Online (Sandbox Code Playgroud)

当我插入列为 null 的行时st_id,执行上面的查询后,结果如下所示:

      st_id    seq
   ---------------
       1       1
       2       2
       3       3
       4       4 …
Run Code Online (Sandbox Code Playgroud)

oracle query oracle-11g-r2 plsql sequence

2
推荐指数
1
解决办法
372
查看次数

查询以查找指定日期之间的活跃天数(状态 = ON 的天数)

我有一张表格,如下所示:

create table z_test_duration
( Days     date,
  Status   char(8)
);
Run Code Online (Sandbox Code Playgroud)

样本数据如下:

地位
2022 年 1 月 1 日
2022 年 1 月 2 日
2022 年 1 月 3 日
2022 年 1 月 4 日 离开
2022 年 1 月 5 日
2022 年 1 月 6 日 离开
2022 年 1 月 7 日
2022 年 1 月 8 日
2022 年 1 月 9 日 离开

想要的结果是这样的

时间到了 OFF_DATE COUNT_OF_ACTIVE_DAYS …

sql-server gaps-and-islands sql-server-2016

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