2017-03-31 135 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