我需要编写一个函数来接收字符串字符并返回日期格式。例如输入是 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)
这不起作用,我只是不知道如何处理第二部分(当输入不正确时)。
我有一个包含大量数据(近 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 查询的逻辑顺序是:
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)
这将如何执行?哪个连接会先执行?如果查询中有不同类型的连接怎么办?在这种情况下执行连接的顺序是什么?提前致谢。
我需要编写一个存储过程来接收 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。
我正在尝试编写一个函数来接收一个数字并返回其二进制格式。这是我迄今为止开发的内容,它可以用于输入: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) 我有一个结构如下的表:
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) 似乎我误解了“订购”的概念。
我有一个包含这种结构和数据的表:
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)
我期望两列Value1
和Value2
从 10 到 1,因为我DESC
用于两列。
但我看到这个输出:
为什么不是Value2
降序排列?
我有一个具有以下结构的表,它是数据:
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_index
和QUERY-2
I 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) 我有一个包含以下结构和数据的表:
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) 我创建了一个这样的序列:
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) 我有一张表格,如下所示:
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 ×6
t-sql ×6
query ×5
oracle ×4
plsql ×3
functions ×1
oracle-11g ×1
order-by ×1
sequence ×1