【问题标题】:SQL Case Statement - how to do itSQL 案例语句 - 怎么做
【发布时间】:2017-03-31 13:34:25
【问题描述】:

我有以下语句,它在 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

【问题讨论】:

  • 您应该有一个表,其中包含要从 [domain] 列中删除的每个 .yyy,而不是编写巨大的 CASE 表达式
  • 请用您正在使用的数据库标记您的问题。
  • 您还可以将所有长度相同的(3、4、5 和 6)组合在一起。

标签: sql if-statement switch-statement case


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    它和你现在的很相似,但使用 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
    

    【讨论】:

    • 不是真的,if 在大多数 RDBM 中都没有这样使用
    【解决方案3】:

    如果 您可以使用 CASE WHEN 这种方式 ... 意味着您必须正确添加代码

    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
    

    【讨论】:

      【解决方案4】:

      我建议另一种方法:创建一个包含要清除的后缀列表的表)并进行一般替换。我是在 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
      

      【讨论】:

      • 另见约翰解决方案
      【解决方案5】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-19
        • 2020-10-31
        • 2023-04-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多