在另一个选择中选择案例

Posted

技术标签:

【中文标题】在另一个选择中选择案例【英文标题】:Select Case inside another Select 【发布时间】:2020-04-04 02:58:36 【问题描述】:

我正在尝试将 CASE 应用于我创建的列。 但问题是我在另一个选择中有一个选择 我正在使用该子查询的值来制作选择案例 我该怎么做?

SELECT
gc.IDGastosComunes,
v.IDPropiedad,
v.Depto,
v.NombreDueno,
(SELECT u2.IDCategoria
    FROM usuarios_tipos u2
    WHERE u2.IDUsuario = v.IDDueno AND
                u2.IDTipo = 10) AS gc.IDCategoria, <-- This return an int -> 1, 2 or 3
    CASE
        WHEN IDCategoria = 1 THEN 'Convenio'
        WHEN IDCategoria = 2 THEN 'Plus'
        WHEN IDCategoria = 3 THEN 'Preferente'
        WHEN IDCategoria = 4 THEN 'Premium'
        WHEN IDCategoria = 5 THEN 'La Serena'
        ELSE ''
  END AS Categoria, <-- This has to show the string
gc.monto,
gc.FechaEmisionPago AS Periodo
FROM
gastos_comunes gc
JOIN vcartera_propiedades v ON (v.IDPropiedad=gc.IDPropiedad)
WHERE v.IDGrupo = 1

【问题讨论】:

既然您只期望每个外部查询记录有一个匹配项,为什么不直接加入呢?它通常比相关子查询便宜。 我试过了,但情况正在削减预期的结果 【参考方案1】:

您通常会在子查询中移动 case 表达式:

SELECT
    gc.IDGastosComunes,
    v.IDPropiedad,
    v.Depto,
    v.NombreDueno,
    (
        SELECT CASE u2.IDCategoria
            WHEN 1 THEN 'Convenio'
            WHEN 2 THEN 'Plus'
            WHEN 3 THEN 'Preferente'
            WHEN 4 THEN 'Premium'
            WHEN 5 THEN 'La Serena'
            ELSE ''
        END
        FROM usuarios_tipos u2
        WHERE u2.IDUsuario = v.IDDueno AND u2.IDTipo = 10
    ) AS Categoria
    gc.monto,
    gc.FechaEmisionPago AS Periodo
FROM gastos_comunes gc
JOIN vcartera_propiedades v ON v.IDPropiedad=gc.IDPropiedad
WHERE v.IDGrupo = 1

旁注:这需要进行测试,但很可能,您的查询可以重写为使用(LEFT) JOIN 而不是内联子查询,这会使语法更短。看起来像:

SELECT
    gc.IDGastosComunes,
    v.IDPropiedad,
    v.Depto,
    v.NombreDueno,
    CASE u2.IDCategoria
            WHEN 1 THEN 'Convenio'
            WHEN 2 THEN 'Plus'
            WHEN 3 THEN 'Preferente'
            WHEN 4 THEN 'Premium'
            WHEN 5 THEN 'La Serena'
            ELSE ''
    END AS Categoria
    gc.monto,
    gc.FechaEmisionPago AS Periodo
FROM gastos_comunes gc
JOIN vcartera_propiedades v ON v.IDPropiedad=gc.IDPropiedad
LEFT JOIN  usuarios_tipos u2 ON u2.IDUsuario = v.IDDueno AND u2.IDTipo = 10
WHERE v.IDGrupo = 1

【讨论】:

Ohhhh.. SELECT CASE IDCATEGORIA... 我是个白痴,我试过很多次,但格式错误

以上是关于在另一个选择中选择案例的主要内容,如果未能解决你的问题,请参考以下文章

在另一个应用程序中捕获文本选择

在核心数据中选择整数类型

如何在另一个选择列表的更改功能上更改选择列表的值? [复制]

如何在另一个选择框上使用相关的选择框?

Oracle 声明变量并在另一个选择查询中使用它

如何在另一个对象列表中选择对象列表