SQLでWebサイト名を「.com」または「co.in」にトリミングする必要があります
例: サイトアドレスが「http://stackoverflow.com/questions/ask?title=trim」であると仮定します。「stackoverflow.com」として結果を取得する必要があります。
「www.google.co.in」のようなシナリオがある場合は、「google.co.in」にする必要があります
SQLでWebサイト名を「.com」または「co.in」にトリミングする必要があります
例: サイトアドレスが「http://stackoverflow.com/questions/ask?title=trim」であると仮定します。「stackoverflow.com」として結果を取得する必要があります。
「www.google.co.in」のようなシナリオがある場合は、「google.co.in」にする必要があります
以下の SQL コードを使用してドメイン名を抽出してください。
DECLARE @WebUrl VARCHAR(35);
SET @WebUrl = 'http://stackoverflow.com/questions/ask?title=trim'
SELECT @WebUrl AS 'WebsiteURL',
LEFT(SUBSTRING(@WebUrl,
(CASE WHEN CHARINDEX('//',@WebUrl)=0
THEN 5
ELSE CHARINDEX('//',@WebUrl) + 2
END), 35),
(CASE
WHEN CHARINDEX('/', SUBSTRING(@WebUrl, CHARINDEX('//', @WebUrl) + 2, 35))=0
THEN LEN(@WebUrl)
else CHARINDEX('/', SUBSTRING(@WebUrl, CHARINDEX('//', @WebUrl) + 2, 35))- 1
END)
) AS 'Domain';
ここでは、特にリファラーのテーブルに対して実行する場合に、多くのバリエーションが存在する可能性があることがわかりました。このため、Web アドレスからホスト名を取得する SQL スクリプトを作成しました。これは、私が見つけたすべてのエッジ ケースにも対応しています。
DECLARE @WebAddress varchar(300) = 'https://www.stevefenton.co.uk/2015/09/select-the-host-name-from-a-string-in-sql/'
SELECT
/* Get just the host name from a URL */
SUBSTRING(@WebAddress,
/* Starting Position (After any '//') */
(CASE WHEN CHARINDEX('//', @WebAddress)= 0 THEN 1 ELSE CHARINDEX('//', @WebAddress) + 2 END),
/* Length (ending on first '/' or on a '?') */
CASE
WHEN CHARINDEX('/', @WebAddress, CHARINDEX('//', @WebAddress) + 2) > 0 THEN CHARINDEX('/', @WebAddress, CHARINDEX('//', @WebAddress) + 2) - (CASE WHEN CHARINDEX('//', @WebAddress)= 0 THEN 1 ELSE CHARINDEX('//', @WebAddress) + 2 END)
WHEN CHARINDEX('?', @WebAddress, CHARINDEX('//', @WebAddress) + 2) > 0 THEN CHARINDEX('?', @WebAddress, CHARINDEX('//', @WebAddress) + 2) - (CASE WHEN CHARINDEX('//', @WebAddress)= 0 THEN 1 ELSE CHARINDEX('//', @WebAddress) + 2 END)
ELSE LEN(@WebAddress)
END
) AS 'HostName'
これは処理します...
www.
(つまり、スキームなし)//
/
SQLCLR 関数を使用し、System.Uri
クラスを活用します。
これが古いスレッドであることは知っていますが、最近これをやろうとしていたのですが、ここでの答えは、で始まる文字列http/s
または新しい gTLD をカバーしていませんでした。そこで、CTE式を使用して、可能な限り読みやすく理解しやすいものにしようと思いついたのは次のとおりです。
うまくいけば、将来このスレッドに出くわした人に役立つでしょう!
DECLARE @Var NVARCHAR(1000)
SET @Var='http://stackoverflow.com/questions/ask?title=trim';
WITH cteWithoutWWW (Domain)
as
(
SELECT
case when PATINDEX('%www.%', @Var) > 0 then
SUBSTRING(@Var, PATINDEX('%www.%', @Var) + 4, LEN(@Var) - PATINDEX('%www.%', @Var))
else
@Var
end
),
cteWithoutHTTP (Domain)
as
(
select
case when PATINDEX('http://%', Domain) > 0 then
SUBSTRING(Domain, PATINDEX('http://%', Domain) + 7, LEN(Domain) - PATINDEX('http://%', Domain))
else
Domain
end
from cteWithoutWWW
),
cteWithoutSlash (Domain)
as
(
select
case when CHARINDEX('/', Domain) > 0 then
SUBSTRING(Domain, 0, CHARINDEX('/', Domain))
else
Domain
end
from cteWithoutHTTP
)
select Domain from cteWithoutSlash
これはどう:
DECLARE @Var NVARCHAR(1000)
SET @Var='http://stackoverflow.com/questions/ask?title=trim'
SET @Var=REPLACE(@Var,'http://','')
IF(LEFT(@Var,4)='www.')
SET @Var=RIGHT(@Var, len(@Var)-4)
IF(PATINDEX('%.com%', @Var)<>0)
SELECT SUBSTRING(@Var,0, PATINDEX('%.com%', @Var)+4)
ELSE IF (PATINDEX('%.co.%', @Var)<>0)
SELECT SUBSTRING(@Var,0, PATINDEX('%.co.%', @Var)+6)
これがコードです。部分文字列を使用してください。.comと.co.inの両方で機能します
DECLARE @string VARCHAR(50), @ind int = 0
SET @string = 'http://stackoverflow.co.in/questions/ask?title=trim'
SET @ind= charindex('.com', @string)
IF @ind = 0
BEGIN
SET @ind= charindex('.co.in', @string)
Print SUBSTRING ( @string ,0 , @ind+6 )
END
ELSE
BEGIN
Print SUBSTRING ( @string ,0 , @ind +4)
END