2017-03-31 136 views
0

我有下面的語句,它在Tableau中很好地工作。SQL Case語句 - 怎麼做

但是,我想將它變成SQL並將所有結果保存到臨時列名稱中。

有誰知道我該怎麼做?

從本質上說,下面的域名刪除.com/.net等等。

然後我有另一個腳本刪除子域(從結果值的第一個到最左邊的所有內容)。

如果有人能幫助我這些,那將是不可思議的是我不知道如何在SQL這樣做

IF CONTAINS([domain], ".co.uk") then LEFT([domain],LEN([domain])-6) 
elseif CONTAINS([domain], ".com") then LEFT([domain],LEN([domain])-4) 
elseif CONTAINS([domain], ".net") then LEFT([domain],LEN([domain])-4) 
elseif CONTAINS([domain], ".org") then LEFT([domain],LEN([domain])-4) 
elseif CONTAINS([domain], ".biz") then LEFT([domain],LEN([domain])-4) 
elseif CONTAINS([domain], ".edu") then LEFT([domain],LEN([domain])-4) 
elseif CONTAINS([domain], ".ac") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".gov") then LEFT([domain],LEN([domain])-4) 
elseif CONTAINS([domain], ".biz") then LEFT([domain],LEN([domain])-4) 
elseif CONTAINS([domain], ".co") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".ca") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".io") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".in") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".it") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".uk") then LEFT([domain],LEN([domain])- 3) 
elseif CONTAINS([domain], ".ru") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".ie") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".tv") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".info") then LEFT([domain],LEN([domain])-5) 
elseif CONTAINS([domain], ".fr") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".es") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".pl") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".is") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".hu") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".xxx") then LEFT([domain],LEN([domain])-4) 
elseif CONTAINS([domain], ".nl") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".ro") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".xyz") then LEFT([domain],LEN([domain])-4) 
elseif CONTAINS([domain], ".no") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".eu") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".me") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".cz") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".fi") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".nl") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".al") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".am") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".af") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".st") then LEFT([domain],LEN([domain])-3) 
elseif CONTAINS([domain], ".cn") then LEFT([domain],LEN([domain])-3) 
else [domain] 
end 
+1

,你應該有一個表,每'.yyy'你想從'[域]刪除'列,而不是寫一個巨大的'CASE'表達 – Lamak

+0

請與數據庫標記您的問題您正在使用。 –

+0

你也可以將所有長度相同的(3,4,5和6)組合在一起。 – Anand

回答

0

這是相當類似的,你現在有什麼,但使用像,而不是包含:

IF domain like '%.co.uk' THEN left(domain,len(domain)-6) 
IF domain like '%.com' THEN left(domain,len(domain)-4) 
... 
ELSE domain END AS stripped_domain 
+0

不是真的,如果在大多數RDBM中不使用「if」 – Lamak

0

如果 你可以應用情況,這樣的...意味着你必須addapr代碼正確

select CASE domain 
      WHEN domain like "%.co.uk" THEN LEFT(domain,LENGTH(domain)-6) 
      WHEN domain LIKE "%. com" THEN LEFT(domain,LENGTH(domain)-4) 
      WHEN domain LIKE "%. net" THEN LEFT(domain,LENGTH(domain)-4) 
      ..... 
      WHEN domain LIKE "%.co" THEN LEFT(domain,LENGTH(domain)-3) 
      WHEN domain LIKE "%.ca" THEN LEFT(domain,LENGTH(domain)-3) 
      .... 
      END 
FROM MY_TABLE 
0

我建議採取一種不同的方法:創建一個帶有你想清除的後綴列表的表格)並製作一個通用的替換。我在MSSQL中完成了它(但是你可以稍微修改其他數據庫)。

反正(在解決方案中太)請確保您要清除字符無法在文字中間(如http://test.com.blabla.us

dot_nation是包含了所有的後綴清除表。 這只是一個例子,我認爲你必須努力。

CREATE TABLE dot_nation 
(
SUFFIX VARCHAR(10) NOT NULL 
); 
ALTER TABLE dot_nation ADD CONSTRAINT dot_nation_PK PRIMARY KEY (SUFFIX); 

INSERT INTO dot_nation VALUES('.co.uk'); 
INSERT INTO dot_nation VALUES('.com'); 
INSERT INTO dot_nation VALUES('.org'); 
INSERT INTO dot_nation VALUES('.fr'); 

CREATE TABLE demo (ID INT, SITE_ADDRESS VARCHAR(500)); 
INSERT INTO demo VALUES (1, 'http:/xxxxx.com'); 
INSERT INTO demo VALUES (2, 'http:/xxxxx.fr'); 
INSERT INTO demo VALUES (3, 'http:/org.en'); 
INSERT INTO demo VALUES (4, 'http:/yyyyyy.co.uk'); 

SELECT demo.*, LEFT(demo.SITE_ADDRESS, LEN(demo.SITE_ADDRESS)-LEN(suffix)) AS ADDRESS_CLEANED 
FROM demo 
LEFT JOIN dot_nation ON SITE_ADDRESS LIKE '%'+SUFFIX+'%' 

輸出:

ID   SITE_ADDRESS   ADDRESS_CLEANED 
----------- -------------------- -------------------- 
1   http:/xxxxx.com  http:/xxxxx 
2   http:/xxxxx.fr  http:/xxxxx 
3   http:/org.en   NULL 
4   http:/yyyyyy.co.uk http:/yyyyyy 
+0

另請參見John解決方案 – etsa

2

如果SQL Server,或許是這樣的

Declare @YourTable table (domain varchar(100)) 
Insert Into @YourTable values 
('somedomain.org'), 
('somedomain.net'), 
('anotherdomain.az'), 
('nodomain'), 
('somedomain.com?Param=1') 

Select A.* 
     ,NoDomain = left(domain,len(domain)-charindex('.',reverse(domain))) 
From @YourTable A 

返回

domain     NoDomain 
somedomain.org   somedomain 
somedomain.net   somedomain 
anotherdomain.az  anotherdomain 
nodomain    nodomain 
somedomain.com?Param=1 somedomain 
0

您可以使用正則表達式S下方

select case when v like '%.[a-z][a-z][a-z]' then left(v, len(v)-4) 
      when v like '%.[a-z][a-z].[a-z][a-z]' then left(v, len(v)-6) 
      when v like '%.[a-z][a-z]' then left(v, len(v)-3) end from #yourTable