如何仅获取带有斜杠的数据及其后的数字?

时间:2018-07-01 17:25:53

标签: sql oracle

我有下表和数据

CREATE TABLE arch (
id INT NOT NULL,
arch_number VARCHAR(30) NOT NULL,
PRIMARY KEY (id)
);

INSERT INTO arch 
(id, arch_number) 
VALUES 
(1,"AN 50"),
(2,"AN 50/0"),
(3,"AN 50/1"),

(4,"AN 51/0"),
(5,"AN 51/1"),

(6,"AN 52/1"),

(7,"AN 53/2");

我只想选择那些斜线后带有数字的arch_number。这意味着在此示例中,我要获取AN 51,AN 52和AN53。应完全忽略AN 50。

我的Sql不能这样工作:

select * from arch where arch_number like '%/%'

这样,我将获得包括AN 50在内的所有AN。但是,在这种情况下,应忽略AN 50,因为id = 1的行中没有斜杠和数字。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

这是一种方法:

WITH
  compare ([Year], Product, ThisYearClient, PrevYearClient, LoyalClient) AS (
    SELECT ISNULL(this.[Year],  prev.[Year]+1)
      , ISNULL(this.Product, prev.Product)
      , this.Client, prev.Client
      , CASE WHEN this.Client = prev.Client THEN this.Client ELSE NULL END
    FROM tblProductClient this
      FULL JOIN tblProductClient prev
        ON this.Product = prev.Product 
        AND this.Client = prev.Client 
        AND this.[Year] = prev.[Year]+1
  ),
  totals ([Year], Product, ClientsThisYear, ClientsPrevYear, LoyalClients, R) AS (
    SELECT [Year], Product
      , COUNT(ThisYearClient)
      , COUNT(PrevYearClient)
      , COUNT(LoyalClient)
      , RANK() OVER (ORDER BY [Year] DESC)
    FROM compare
    GROUP BY [Year], Product
  )
SELECT [Year], Product, ClientsThisYear, ClientsPrevYear, LoyalClients 
  , ClientsThisYear - LoyalClients AS NewClients
  , ClientsPrevYear - LoyalClients AS MissingClients
FROM totals WHERE R > 1
ORDER BY [Year], Product

答案 1 :(得分:2)

您可以使用INSTR函数来获取/列上arch_number不存在的行数据,然后使用not exists子查询来过滤arch_number不包含/

SELECT *
FROM arch t
WHERE not exists (
  select *
  from arch t1
  where INSTR(t1.arch_number,'/',1,1) = 0 
    and t.arch_number like '%' || t1.arch_number || '%'
);

sqlfiddle:http://sqlfiddle.com/#!4/c56df/26