Mysql

如何過濾拆分列值?

  • March 12, 2018

我是 SQL 世界的新手,我只使用簡單的插入、選擇、刪除和更新進行編碼。

所以……我有一個名為“市場”列的表格,其中包含一個加密貨幣列表……就像這樣……

market
-------
EOS/ETH    
EOS/BTC
XMR/BTC
LTC/BTC
DASH/ETH
...

我需要從該表中選擇 *,其中:

  • ‘/’ 之前的字元串彼此相等,但 ‘/’ 之後的字元串是 ETH 和 BTC。
  • 我也想過濾一個名為 exchange 的列。在此範例中,將是所有這些硬幣,其中 exchange = ‘bittrex’

在此範例中,結果將是:

EOS/ETH 
EOS/BTC

任何人都可以幫忙嗎?

為此,您可以使用INSTR()、LEFT()、RIGHT()、LENGTH() 等字元串函式。

create table market(id int, col varchar(100), exchange varchar(100));

insert into market values
(1, 'EOS/ETH',  'bittrex'),
(2, 'EOS/BTC',  'other'),
(3, 'EOS/BTC',  'bittrex'),
(4, 'XMR/BTC',  'other'),
(5, 'LTC/BTC',  'other'),
(6, 'DASH/ETH', 'other');
select *
from   market t1
where  right(t1.col, length(t1.col) - instr(t1.col, '/')) IN ('ETH','BTC')
and    exchange = 'bittrex'
and    exists (select 1
               from market t2
               where left(t2.col, instr(t2.col, '/')) = left(t1.col, instr(t1.col, '/'))
               and right(t2.col, length(t2.col) - instr(t2.col, '/')) IN ('ETH','BTC')
               and   exchange = 'bittrex'
               group by left(t2.col, instr(t2.col, '/'))
               having count(*) > 1)
編號 | 上校 | 交換
-: | :------ | :-------
 1 | EOS/ETH | 比特雷克斯
 3 | EOS/比特幣 | 比特雷克斯

dbfiddle在這裡

正如 Rick James 在他的評論中指出的那樣,您可以使用 SUBSTRING_INDEX() 並獲得相同的結果。

select *
from   market t1
where  substring_index(t1.col, '/', -1) IN ('ETH','BTC')
and    exchange = 'bittrex'
and    exists (select   1
               from     market t2
               where    substring_index(t2.col, '/', 1) = substring_index(t1.col, '/', 1)
               and      substring_index(t1.col, '/', -1) IN ('ETH','BTC')
               and      exchange = 'bittrex'
               group by substring_index(t1.col, '/', -1)
               having   count(*) > 1)
編號 | 上校 | 交換
-: | :------ | :-------
 1 | EOS/ETH | 比特雷克斯
 3 | EOS/比特幣 | 比特雷克斯

dbfiddle在這裡

引用自:https://dba.stackexchange.com/questions/199934