标签: case

具有多个订单条件的逐案排序

我想知道如何在案例中使用多个订单列。例如 case 1,order by FirstName, GivenName case 2 order by GivenName, FirstName。

我试过这个,但看起来冒号引入了一个错误

按大小写排序,当 1 然后 FirstName, GivenName else GivenName, FirstName end

mysql order-by case

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

基于参数构建 where 子句

在 PostgreSQL 中,我试图在一个函数中构建一个 where 子句,该函数使用入站参数来确定 IN 的内容

例如:

select fld1, count(fld1)
from xyz
where fld1 in (
    case $1
        when 1 then 'Value1'
        when 2 then 'Value2'
        when 3 then '''Value1'',''Value2'''
        when 4 then '''Value4'',''Value5'',''Value6'''
    else NULL
)
group by fld1
Run Code Online (Sandbox Code Playgroud)

值 1 和值 2 一样正常工作,值 3 和 4 在语法上没有失败,但没有返回任何行。

postgresql case where

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

Group By With Rollup 结果表在顶部有总计

我有以下查询,从星期一开始,按周返回一组计数,一行是汇总总数。

select distinct 
    DATEPART(ISO_WEEK, ig.IN_EVT_DT_TM) as B2B_Week,
    count (distinct bm.MISSION_ID) as B2B_Mission,
    count (distinct dl.DRIVER) as Distinct_B2B_Drivers
from 
    DD.B2B_MISSIONS bm
    inner join dd.IN_GATE ig on bm.MISSION_ID = ig.IN_MISSION_ID
    inner join dd.XNS_DRIVER_LOGIN dl on ig.IN_DRIVER_ID = dl.driver 
group by 
    DATEPART(ISO_WEEK, ig.IN_EVT_DT_TM) 
  with rollup
order by 
    DATEPART(ISO_WEEK, ig.IN_EVT_DT_TM)
;
Run Code Online (Sandbox Code Playgroud)

我的结果表如下所示:

B2B_Week    B2B_Mission Distinct_B2B_Drivers
            1647        357
44          717         264
45          930         301
Run Code Online (Sandbox Code Playgroud)

我希望它看起来像这样:

B2B_Week    B2B_Mission Distinct_B2B_Drivers
44          717         264
45          930         301
TOTAL       1647        357
Run Code Online (Sandbox Code Playgroud)

问题

  1. 总计行出现在顶部而不是底部。这很可能与第二个问题有关。

  2. 我一直无法使用 CASE 语句返回日期列为 NULL 的“TOTAL”。主要问题是 DATE …

sql-server case group-by

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

使用 SELECT 列表中的表达式来精简 CASE 语句

我有一个查询,我通过重写工作-它有一个巨大的一堆case文中陈述select列表中的所有基本是这样的:

select
    Column1 = 
        case when (Something = 2) and (SomethingElse is null) and (AnotherThing in (1, 2))
        then 1 
        else 0
        end,
    Column2 = 
        case when (Something = 3) and (SomethingElse is not null) and (AnotherThing in (2, 3))
        then 1 
        else 0
        end,
    ...
Run Code Online (Sandbox Code Playgroud)

特别注意when <expressions> then 1 else 0所有这些通用的“ ”逻辑。

它看起来真的很臃肿和冗长,是对case语句的粗暴使用- 我的编程大脑告诉我这可以通过一些基本的二进制&逻辑更简洁地实现,case完全删除:

select
    Column1 = (Something = 2) & (SomethingElse is null) & …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2 select case

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

如何在 SQL Server 中按字母数字代码排序

我有一个包含一些项目代码的表格。这些代码是

e.g.: B001, B002, Z15001, Z14001, P003,...
Run Code Online (Sandbox Code Playgroud)

我需要这个结果表:

Z15001
Z15002
...
B001
B002
...
C001
C002
...
Z14099
Z14098
Z14097
...
Z13099
Z13098
...
Z13001
Run Code Online (Sandbox Code Playgroud)

我试过了,但顺序不对。

select *
from table
order by
    case
        when Kod like 'Z15%' then 1
        when Kod like 'B%' then 2
        when Kod like 'C%' then 3
        when Kod like 'D%' then 4
        when Kod like 'E%' then 5 else 6 end asc, Kod asc
    , case when Kod NOT LIKE 'B%' 
        AND Kod NOT LIKE …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server order-by case

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

如何排除列中包含空值的行?

这可能不是检索列中包含指定值的行的理想查询,但下面的解决方案有效地返回新列别名中指定的值,但包含 NULL 值。如何构建以下查询来排除列别名中包含 NULL 值的行?

SELECT student_id,
       salutation,
       CASE
           WHEN salutation IN('Dr.') THEN 'Doctor'
       END AS "NewSalutation"
FROM student.student
Run Code Online (Sandbox Code Playgroud)

我欢迎其他方法 - 谢谢!

oracle case

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

空结果集和 Case When = 1

我很确定这是一个隐式转换,但我无法找到有关它的信息。

假设我有这个 SQL:

SELECT
CASE WHEN (SELECT 1 WHERE (1=1)) = 1 THEN 1 ELSE 0 END
Run Code Online (Sandbox Code Playgroud)

我的子查询返回一行,因此与 1 进行比较。这导致我的 CASE WHEN 产生 1 输出。

即使我将子查询设置为不返回如下示例所示的行,CASE 语句也会返回 0 结果:

SELECT
CASE WHEN (SELECT 1 WHERE (1=0)) = 1 THEN 1 ELSE 0 END
Run Code Online (Sandbox Code Playgroud)
  • SQL 解释器是否在“空集”到 0 或 1 之间进行转换?
  • 使用这种类型的比较让我感到不舒服。以我的拙见,最好像这样使用 EXISTS:

    SELECT
    CASE WHEN EXISTS(SELECT 1 WHERE (1=1)) THEN 1 ELSE 0 END
    
    Run Code Online (Sandbox Code Playgroud)

如果我不使用 EXISTS 有什么优点或缺点吗?

sql-server case

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

当字符串包含阿拉伯语单词时,如何在 SELECT CASE 中创建新列?

我的 select case when 语句有问题,我想在 select case when 语句中添加一个新列,我得到了结果,但是?????因为我已将该列设置为阿拉伯语单词,所以我试图转换新列nvarchar(55)不幸的是,我得到了相同的结果。

我怎样才能得到正确的结果?

SELECT case when ( CAST(o.startTime as time(7)) > cast(Start as time(7))) 
          then  cast('????' as nvarchar(55))
          else cast('????' as nvarchar(55)) end as stat,
       userId, FirstName
from   Users, TimeTable
Run Code Online (Sandbox Code Playgroud)

sql-server collation case encoding unicode

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

出现问题时的 Oracle 案例

我有一张像休闲的桌子

    work_id      group    effort
   -----------   -----   --------
       1           A        10
       1           B        5
       2           A        7
       2           C        20
       2           B         3
Run Code Online (Sandbox Code Playgroud)

我需要一个查询返回像休耕的情况

   work_id       1.group   effort1   2.Group  effort2    3.group  effort3
   -----------   -----     --------  -------  ------    -------  ------
       1           A        10        B        5
       2           A        7         C        20        B         3
Run Code Online (Sandbox Code Playgroud)

组根据另一个表中的另一个参数进行分组。但是当我写我的查询时

case when <condition1> then group end as 1.group
case when <condition2> then group end as 2.group
case when <condition4> then group end as 3.group
Run Code Online (Sandbox Code Playgroud)

...(努力也是一样)

它返回

work_id       1.group   effort   2.Group …
Run Code Online (Sandbox Code Playgroud)

oracle case

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

避免重复的 CASE 表达式

SELECT x, y, z,
CASE
WHEN COUNT (PH.header_id) OVER (PARTITION BY PL.header_id)
    NOT IN (null,0) THEN L_Count
ELSE COUNT (PH.header_id) OVER (PARTITION BY PL.header_id)
END as quantity
Run Code Online (Sandbox Code Playgroud)

有没有更有效的写法?

我非常清楚它在一张大桌子上执行了两次计数。

不幸的是,我无法发布查询计划,因为我正在使用的用户帐户正在等待 SHOWPLAN 权限。

NOT IN 子句是一个附带问题。感谢您提供有关改进方法的评论反馈,但问题的焦点是重复计数。

sql-server case query-performance

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