【问题标题】:Conditionally append a character in select statement有条件地在 select 语句中附加一个字符
【发布时间】:2012-05-11 19:07:24
【问题描述】:

我正在尝试添加到我的 DB2 存储过程的功能:

    Select a MIN() date from a joined table column.
    IF there was more than one row in this joined table, append a " * " to the date.

谢谢,非常感谢任何帮助或指导。

【问题讨论】:

  • 只需编写查询以获取日期的最小值,将日期转换为字符串,并使用以下 case 语句连接该字符串:(case when count(*) > 1 then '*'否则''结束)。我不记得在 DB2 中将日期转换为字符串的命令,所以我不能轻易提供 SQL。
  • 我尝试在连接中添加一个 if 检查。如果行数大于 1,则添加字符。不会编译
  • @GordonLinoff 我认为您正在寻找 VARCHAR_FORMAT(,)
  • 特德,SQL 不理解“如果”。您需要使用 case 语句。
  • 你确定这必须在数据库层完成吗?这听起来像一个显示问题。我实际上会将 count 作为单独的列返回,然后让我的最终显示代码进行字符连接。当然,您不能在 JOIN 中执行此操作 - 您必须包装初始的 SELECT

标签: sql stored-procedures db2


【解决方案1】:

尚不清楚需要哪种 DB2 风格,也不清楚任何建议是否有效。这适用于 DB2 for i:

SELECT
 T1.joinCol1,
 max( T2.somedateColumn ),
 count( t2.somedateColumn ),
 char(max( T2.somedateColumn )) concat case when count( T2.somedateColumn )>1 then '*' else '' end 
 FROM joinFile1 t1 join joinFile2 t2
           on joinCol1 = joinCol2
 GROUP BY T1.joinCol1
 ORDER BY T1.joinCol1

SQL 相当通用,因此它应该可以转换为许多环境和版本。

根据需要替换表名和列名。这里的 COUNT() 实际上是从 JOIN 计算行数,而不是具体日期出现的次数。如果需要计算重复日期,则还需要对该示例进行一些更改。

【讨论】:

    【解决方案2】:

    希望对你有帮助

    说我的结果是

    
    1   Jeff    1
    2   Jeff    333
    3   Jeff    77
    4   Jeff    1
    5   Jeff    14
    6   Bob     22
    7   Bob     4
    8   Bob     5
    9   Bob     6
    

    这里的值 1 重复两次(在 3 列中)

    所以,这个查询得到的计数是 2 以及与之连接的 *

    
    
    

    SELECT A.USER_VAL, DECODE(A.CNT, '1', A.CNT, '0', A.CNT, CONCAT(A.CNT, '*')) AS CNT FROM (SELECT DISTINCT BT.USER_VAL, CAST(COUNT(*) AS VARCHAR2(2)) AS CNT FROM SO_BUFFER_TABLE_8 BT GROUP BY BT.USER_VAL) A

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      • 1970-01-01
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多