Reputation:
I have the below statement which works nicely in Tableau.
However, I'd like to turn this into SQL and save all the results into a temporary column name.
Does anyone know how I might do this?
Essentially, the below removes the .com/.net etc... from the domain name.
I then have another script that removes the subdomain (everything from the first . to the left of the resulting value).
If anyone can help me with these, that would be incredible as I'm not sure how to do this in 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
Upvotes: 0
Views: 93
Reputation: 13969
You can use Regular expression as below
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
Upvotes: 0
Reputation: 82000
If SQL Server, perhaps something like this
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
Returns
domain NoDomain
somedomain.org somedomain
somedomain.net somedomain
anotherdomain.az anotherdomain
nodomain nodomain
somedomain.com?Param=1 somedomain
Upvotes: 2
Reputation: 5060
I suggest a different approach: Create a table with a list of the suffix you want to purge) and make a general substition. I did it in MSSQL (but you can adapt for other DB with small changes).
Anyway (in your solution too) be sure that the characters your are going to purge cannot be in the middle of the text (eg. http://test.com.blabla.us
)
dot_nation is the table with contains all the suffix to purge. It is just an example and I think you have to work on it.
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+'%'
Output:
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
Upvotes: 0
Reputation: 133390
if
You could use CASE WHEN this way the ...
mean that you must addapr the code properly
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
Upvotes: 0
Reputation: 766
It's quite similar to what you have now, but use like instead of 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
Upvotes: 0