SQL Case语句-如何执行

SQL Case语句-如何执行,sql,if-statement,switch-statement,case,Sql,If Statement,Switch Statement,Case,我有下面的陈述,它在Tableau中运行得很好 但是,我想将其转换为SQL并将所有结果保存为临时列名 有人知道我该怎么做吗 本质上,下面的内容删除了.com/.net等。。。从域名 然后,我有另一个脚本删除子域(从结果值的第一个.到左边的所有内容) 如果有人能帮我做这些,那将是难以置信的,因为我不知道如何在SQL中做到这一点 IF CONTAINS([domain], ".co.uk") then LEFT([domain],LEN([domain])-6) elseif CONTAINS([

我有下面的陈述,它在Tableau中运行得很好

但是,我想将其转换为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

它与您现在拥有的非常相似,但使用like而不是contains:

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

它与您现在拥有的非常相似,但使用like而不是contains:

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
如果 当
表示必须正确添加代码时,可以使用CASE

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
如果 当
表示必须正确添加代码时,可以使用CASE

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

我建议采用另一种方法:创建一个包含要清除的后缀列表的表,并创建一个常规子项。我在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

我建议采用另一种方法:创建一个包含要清除的后缀列表的表,并创建一个常规子项。我在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

如果是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

如果是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

您可以使用正则表达式,如下所示

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

您可以使用正则表达式,如下所示

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

你应该有一个表,其中包含你想从
[domain]
列中删除的每个
.yyy
,而不是写一个巨大的
案例
表达式。请用你正在使用的数据库标记你的问题。你还可以将所有长度相同的问题(3、4、5和6)组合在一起。您应该有一个表,其中包含要从
[domain]
列中删除的每个
.yyy
,而不是写一个巨大的
案例
表达式。请用您正在使用的数据库标记您的问题。您还可以将所有长度相同的问题(3、4、5和6)组合在一起。实际上,
如果
在大多数RDBMS中没有像那样使用,那么实际上,
如果
在大多数RDBMS中没有像那样使用,请参见John Solutions参见John Solutions