Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用';介于'之间;运算符在'之后;然后';在';案例';在'内的声明;其中';条款_Sql_Oracle - Fatal编程技术网

Sql 使用';介于'之间;运算符在'之后;然后';在';案例';在'内的声明;其中';条款

Sql 使用';介于'之间;运算符在'之后;然后';在';案例';在'内的声明;其中';条款,sql,oracle,Sql,Oracle,WHERE子句中的CASE语句中是否可以使用BEVER运算符?例如,在下面的代码中,如果是星期一,则条件应该是介于(sysdate-12)和(sysdate-2)之间的pydate,如果是星期二,则条件应该是介于(sysdate-11)和(sysdate-1)之间的pydate,依此类推。但是下面的方法不起作用。也许还有另一种写作方式。有人能帮忙吗 select * from table_name where pricekey = 'JUF' and case when to_ch

WHERE子句中的CASE语句中是否可以使用BEVER运算符?例如,在下面的代码中,如果是星期一,则条件应该是介于(sysdate-12)和(sysdate-2)之间的pydate,如果是星期二,则条件应该是介于(sysdate-11)和(sysdate-1)之间的pydate,依此类推。但是下面的方法不起作用。也许还有另一种写作方式。有人能帮忙吗

  select * from table_name
  where pricekey = 'JUF' and  
 case when to_char(to_date(sysdate,'DD-MON-YY'), 'DY')='MON' then pydate between to_date(sysdate-12,'DD-MON-YY') and to_date(sysdate-2,'DD-MON-YY')
 when to_char(to_date(sysdate,'DD-MON-YY'), 'DY')='TUE' then pydate between to_date(sysdate-11,'DD-MON-YY') and to_date(sysdate-1,'DD-MON-YY')
 else pydate='sysdate'
 end

您可以应用正在尝试的逻辑,但不使用
案例
。相反,您需要创建
或/和
的逻辑分组,以将之间的
与案例中的其他匹配条件结合起来

这是因为
CASE
被设计为返回一个值,而不是在其中动态构造SQL

SELECT *
FROM  table_name
WHERE
  pricekey = 'JUF'
  AND (
    -- Condition 1
    (to_char(to_date(sysdate,'DD-MON-YY'), 'DY') = 'MON' AND pydate BETWEEN to_date(sysdate-12,'DD-MON-YY') AND to_date(sysdate-2,'DD-MON-YY'))
    -- Condition 2
    OR (to_char(to_date(sysdate,'DD-MON-YY'), 'DY')='TUE' AND pydate BETWEEN to_date(sysdate-11,'DD-MON-YY') AND to_date(sysdate-1,'DD-MON-YY'))
    -- ELSE case, matching neither of the previous 2
    OR (to_char(to_date(sysdate,'DD-MON-YY'), 'DY') NOT IN ('MON', 'TUE') AND pydate = 'sysdate')
  )

这很难使用
案例编写。只要做:

where pricekey = 'JUF' and  
      ((to_char(to_date(sysdate,'DD-MON-YY'), 'DY') = 'MON' and
        pydate between to_date(sysdate-12,'DD-MON-YY') and to_date(sysdate-2,'DD-MON-YY')
       ) or
       (to_char(to_date(sysdate,'DD-MON-YY'), 'DY') = 'TUE' and
        pydate between to_date(sysdate-11,'DD-MON-YY') and to_date(sysdate-1,'DD-MON-YY')
       ) or
       (o_char(to_date(sysdate,'DD-MON-YY'), 'DY') not in ('MON', 'TUE') and
        pydate = trunc(sysdate)
       )
      )

注意,我还删除了“sysdate”周围的单引号,因此它不会被视为字符串。而且,我尝试着在没有时间的情况下只获取日期部分。

首先,sysdate是一个日期,所以不要在它上面使用日期

其次,不要依赖日期名称。一旦选择了另一种语言设置,您的语句可能不再有效

那么pydate就是一个日期。sysdate是一个日期。不要将pydate与字符串“sysdate”进行比较,而是与sysdate进行比较

您似乎还试图从sysdate中删除带有to_date(sysdate-11,'DD-MON-YY')的时间部分。用于删除日期时间的时间部分的函数是trunc

然后case语句应该返回一个值。SQL中没有布尔数据类型,因此无法对其中的表达式求值并返回结果。而不是这样做,您将返回一个有效的数据类型,例如可以在外部进行比较的数字或字符串:

select * 
from table_name
where pricekey = 'JUF' and  
case 
  when to_char(sysdate, 'DY', 'NLS_DATE_LANGUAGE=AMERICAN')='MON' then
    case when pydate between trunc(sysdate)-12 and trunc(sysdate)-2 then 'GOOD' else 'BAD' end
  when to_char(sysdate, 'DY', 'NLS_DATE_LANGUAGE=AMERICAN')='TUE' then 
    case when pydate between trunc(sysdate)-11 and trunc(sysdate)-1 then 'GOOD' else 'BAD' end
  else 
    case when pydate = trunc(sysdate) then 'GOOD' else 'BAD' end
end = 'GOOD';
如果pydate可以有一个时间部分,那么您可能也希望用trunc(pydate)替换pydate

当然,您可以使用一些and、OR和括号而不是CASE语句来完成所有这些。什么对你来说更具可读性取决于你