我想在一周的不同日期运行不同的SELECT语句。
我实际上可以使以下代码起作用:
select
case
when DATEPART(DW, GETDATE()) = 4 then
(select 'HELLO' )
ELSE
(select 'GOODBYE')
end
[星期三,上面的代码返回“ HELLO”,每隔一个工作日它将返回“ Goodbye”。到目前为止一切顺利!
只要select语句仅返回一个值,它就可以正常工作,但是我确实想要一个完整的表,如下所示。
这里唯一的区别应该是[* FROM table]部分,并且将其全部打破:
select
case
when DATEPART(DW, GETDATE()) = 4 then
(select * FROM table1)
ELSE
(select * FROM table2)
end
如果我什至不能使以上工作正常进行,那么我将无法在不同的工作日进行不同的选择,因此很难确定。
我试图用()封装事物,并以不同的方式添加一些SELECT,但它不起作用,因此它可能是一些SQL主体。
我收到一个错误提示,如果仅返回一个值,这是可以的:
SqlState 37000本机116 [Microsoft] [ODBC SQL Server驱动程序] [SQL服务器]在以下情况下,只能在选择列表中指定一个表达式子查询未使用EXISTS引入。
我不完全了解您要实现的目标。当然,您的语句将不起作用,因为select
中的case when
语句返回多个列和行。那是行不通的,因为您的case when
语句将显示一个列!
因此您可以执行以下操作:
select
case
when DATEPART(DW, GETDATE()) = 4 then
'HELLO'
ELSE
'GOODBYE'
end as [someField],
*
from
[table]
此查询将把table
中的所有行和列作为输出+ someField
显示HELLO
或GOODBYE
。如果要在不同日期(星期三或非星期三)显示表中的不同数据,则可以通过以下方式更改查询:
select
case
when DATEPART(DW, GETDATE()) = 4 then
[table].[field1]
ELSE
[table].[field2]
end as [someField],
*
from
[table]
这是您在寻找吗?子查询应返回1行并指定col名称
select
case
when DATEPART(DW, GETDATE()) = 4 then
(select top 1 col1 from table1 )
ELSE
(select top 1 col2 from table2 )
end as result
From table
CASE WHEN
,THEN
只能返回单个值,对于具有多行和/或列的结果集,never只能返回。这就是CASE WHEN
的工作方式。
您可以像这样实现您所需要的:
DECLARE @DAY INT = DATEPART(DW, GETDATE())
select * FROM table
WHERE (@DAY = 4 AND table.SomeCol = SomeValue)
OR (@DAY = 5 AND table.SomeCol = SomeOtherValue)
... repeat for other days
或类似这样:
DECLARE @DAY INT = DATEPART(DW, GETDATE())
IF @DAY = 4
(select * FROM table WHERE table.SomeCol = SomeValue)
ELSE IF @DAY = 5
(select * FROM table WHERE table.SomeCol = SomeOtherValue)
... repeat for other days
或类似这样:
DECLARE @DAY INT = DATEPART(DW, GETDATE())
select * FROM table
WHERE @DAY = 4 AND table.SomeCol = SomeValue
UNION ALL
select * FROM table
WHERE @DAY = 5 AND table.SomeCol = SomeOtherValue
UNION ALL
... repeat for other days
我的偏好可能是第一种或第二种形式。
查询必须返回之前已知的列。如果表table1
和table2
的列不同,则无法编写一个查询,该查询一天返回表1的五列,而表2的另一列则返回九。
但是,只要结果列保持不变,就可以选择加入。这是一个小例子:
select
p.project_id,
p.project_name,
coalesce(c1.name, c2.name) as team_member,
coalesce(c1.salary, c2.salary * (1.0 + c2.tax / 100.0)) as team_member_salary,
coalesce(c1.job_name, c2.job_title) as team_member_job
from project p
left join crew1 c1 on c1.project_id = p.project_id and datepart(dw, getdate()) = 4
left join crew2 c2 on c2.project_id = p.project_id and datepart(dw, getdate()) <> 4
order by p.project_id;
不确定我是否真的了解您要在这里实现的目标。此示例假设您基于日期从不同的表中读取数据,并将返回两个表中的所有行:
您需要一个控制流