我的SQL-在不同的工作日运行不同的SELECT

问题描述 投票:0回答:6

我想在一周的不同日期运行不同的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引入。

sql sql-server select case getdate
6个回答
0
投票

我不完全了解您要实现的目标。当然,您的语句将不起作用,因为select中的case when语句返回多个列和行。那是行不通的,因为您的case when语句将显示一个列

因此您可以执行以下操作:

select 
   case 
      when DATEPART(DW, GETDATE())  = 4 then 
         'HELLO'
      ELSE 
         'GOODBYE'
   end as [someField],
   *
from
   [table]

此查询将把table中的所有行和列作为输出+ someField显示HELLOGOODBYE。如果要在不同日期(星期三或非星期三)显示表中的不同数据,则可以通过以下方式更改查询:

select 
   case 
      when DATEPART(DW, GETDATE())  = 4 then 
         [table].[field1]
      ELSE 
         [table].[field2]
   end as [someField],
   *
from
   [table]

0
投票

这是您在寻找吗?子查询应返回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

0
投票
对于每个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

我的偏好可能是第一种或第二种形式。


0
投票

查询必须返回之前已知的列。如果表table1table2的列不同,则无法编写一个查询,该查询一天返回表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;

0
投票

不确定我是否真的了解您要在这里实现的目标。此示例假设您基于日期从不同的表中读取数据,并将返回两个表中的所有行:


0
投票

您需要一个控制流

© www.soinside.com 2019 - 2024. All rights reserved.