首页 > 解决方案 > 如何在 oracle 查询中将所有相似的行数据视为一个?

问题描述

我有一个系统,我需要在其中获取存储在名为 tg800 的 SMS 网关中的所有消息。

我正在使用在 tomcat 中运行的 Spring MVC 开发它。

我将所有收到的消息存储到一个名为

SMS_MESSAGES

CREATE TABLE CWMS_USER.SMS_MESSAGES
(
  MESSAGE_ID             VARCHAR2(4000 CHAR),
  SENDER                 VARCHAR2(4000 CHAR),
  SMSC                   VARCHAR2(13 CHAR),
  PORT_ID                VARCHAR2(1 CHAR),
  CONTENT                VARCHAR2(4000 CHAR),
  RECEIVE_TIME           VARCHAR2(30 CHAR),
  HAS_READ               VARCHAR2(3 CHAR),
  IS_ASSIGNED_TO_TICKET  VARCHAR2(50 CHAR),
  ID                     NUMBER                 NOT NULL,
  MESSAGE_STATUS         VARCHAR2(20 CHAR),
  TYPE_OF_MESSAGE        VARCHAR2(20 CHAR)      NOT NULL
 ) 

我将所有发送的消息存储到一个名为

SMS_REPLY

CREATE TABLE CWMS_USER.SMS_REPLY
(
  MESSAGE_ID             VARCHAR2(4000 CHAR),
  SENDER                 VARCHAR2(4000 CHAR),
  SMSC                   VARCHAR2(13 CHAR),
  PORT_ID                VARCHAR2(1 CHAR),
  CONTENT                VARCHAR2(4000 CHAR),
  RECEIVE_TIME           VARCHAR2(30 CHAR),
  HAS_READ               VARCHAR2(3 CHAR),
  IS_ASSIGNED_TO_TICKET  VARCHAR2(50 CHAR),
  ID                     NUMBER                 NOT NULL,
  MESSAGE_STATUS         VARCHAR2(20 CHAR),
  TYPE_OF_MESSAGE        VARCHAR2(20 CHAR)      NOT NULL
)

当您打开消息应用程序时,您会看到号码、最新消息、收到日期等。按日期排序并按编号分组。这就是我需要看到的。

我遇到的问题是 TG800 存储数字的方式不同。

例如:在 SMS_MESSAGES 中,号码是 +639183478372

在 SMS_REPLY 中,号码是 639183478372

该查询不会将这两个数字视为一个数字,因为 SMS_MESSAGES 中的数字有一个加号。

我无法控制 TG800 如何存储号码。

有没有办法把它当作一个?

SELECT * FROM((SELECT * FROM SMS_MESSAGES
    LEFT JOIN
    (SELECT CONTACT_NAME, CONTACT_NO FROM SMS_CONTACTS) foo
    ON SMS_MESSAGES.SENDER = foo.CONTACT_NO)
    UNION
    (SELECT * FROM SMS_REPLY
    LEFT JOIN
    (SELECT CONTACT_NAME, CONTACT_NO FROM SMS_CONTACTS) foo
    ON SMS_REPLY.SENDER = foo.CONTACT_NO)) WHERE (SENDER, RECEIVE_TIME) 
            IN (SELECT SENDER, MAX(RECEIVE_TIME) FROM ((SELECT * FROM SMS_MESSAGES
    LEFT JOIN
    (SELECT CONTACT_NAME, CONTACT_NO FROM SMS_CONTACTS) foo
    ON SMS_MESSAGES.SENDER = foo.CONTACT_NO)
    UNION
    (SELECT * FROM SMS_REPLY
    LEFT JOIN
    (SELECT CONTACT_NAME, CONTACT_NO FROM SMS_CONTACTS) foo
    ON SMS_REPLY.SENDER = foo.CONTACT_NO)) GROUP BY SENDER,PORT_ID) ORDER BY RECEIVE_TIME desc

这是我正在使用的查询,它没有将相同的数字视为一个。

我需要把它作为一个,因为它们是相同的数字。请帮助我。

标签: javaoraclespring-mvc

解决方案


推荐阅读