SQL Case语句-如何执行
我有下面的陈述,它在Tableau中运行得很好 但是,我想将其转换为SQL并将所有结果保存为临时列名 有人知道我该怎么做吗 本质上,下面的内容删除了.com/.net等。。。从域名 然后,我有另一个脚本删除子域(从结果值的第一个.到左边的所有内容) 如果有人能帮我做这些,那将是难以置信的,因为我不知道如何在SQL中做到这一点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([
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