【问题标题】:Case function assistance needed需要案例功能协助
【发布时间】:2011-11-06 01:25:09
【问题描述】:

我有四张桌子。我称他们为 A-D。

SELECT A.ID, B.FirstName, B.LastName, C.Desc, A.Qty, A.Price, D.State,
A.Qty * A.Price AS "Total Price",
CASE D.State
when 'CA' then '***'
when 'MD' then '***'
when 'IL' then '***'
Else D.State
END
FROM A, B, C, D;

上面的 SELECT 语句显示所有数据,当状态为 CA、MD 或 IL 时,它会列出一个名为 CASE 的新列并显示三个星号。

我需要得到它,以便每当 D.State 是 CA、MD 或 IL 时,A.Qty、A.Price 和总价格计算都用三个星号填充,以隐藏数据和不会创建额外的 CASE 列。如果行在 D.State 中没有 CA、MD 或 IL,则整个行需要正常显示,不带星号。我已经尝试了几个循环,但我似乎无法做到这一点。如果有人有任何想法,我将不胜感激。

【问题讨论】:

    标签: sql oracle case


    【解决方案1】:

    把它写成一个联合会更容易。

    SELECT A.ID, B.FirstName, B.LastName, C.Desc, A.Qty, A.Price, D.State, D.Qty * D.Price AS "Total Price", D.State
    FROM A, B, C, D
    WHERE D.State NOT IN ('CA', 'MD', 'IL')
    UNION ALL
    SELECT '****' AS ID, '****' AS FirstName, '****' AS LastName, '****' AS Desc, '****' AS Qty, A.Price, '****' AS State, '****' AS  AS "Total Price", D.State
    FROM A, B, C, D
    WHERE D.State IN ('CA', 'MD', 'IL')
    

    顺便说一句,您缺少加入条件。

    【讨论】:

    • 谢谢,我在第 1 行得到 ORA-01790:表达式必须与对应的表达式具有相同的数据类型。
    • 一些列是整数(或浮点数),但在联合的第二个查询中它们是字符串。您必须在第一个查询中将整数转换/转换为字符串 (varchar)。
    • 谢谢,解决了这个问题。现在我遇到的问题是名字、姓氏、描述和状态都一遍又一遍地显示相同的记录。只有数量、项目价格和总价在变化。有什么想法吗?我是这里的初学者,所以我不太熟悉正确地进行连接/联合。
    • 您需要添加加入条件。我无法帮助您,因为您没有向我展示您的表格结构 - 但基本上这 4 个表格是如何相互关联的?
    • 表A-id号,数量号,价格号,pk=id
    【解决方案2】:

    你需要把case逻辑放在每一列上:

    SELECT A.ID, B.FirstName, B.LastName, C.Desc,
    case D.State when 'CA' then '***' when 'MD' then '***' when 'IL' then *** else A.Qty end, 
    case D.State when 'CA' then '***' when 'MD' then '***' when 'IL' then *** else A.Price end, 
    D.State,
    case D.State when 'CA' then '***' when 'MD' then '***' when 'IL' then *** else D.Qty * D.Price end AS "Total Price",
    CASE D.State
    when 'CA' then '***'
    when 'MD' then '***'
    when 'IL' then '***'
    Else D.State
    END
    FROM A, B, C, D;
    

    【讨论】:

    • 谢谢。在您的第 5 行,我得到一个 ORA-00932:不一致的数据类型:预期的 CHAR 得到了 NUMBER。
    • 尝试做“else cast(A.Qty as char(10))”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多