【问题标题】:Substring output for different cases不同情况的子字符串输出
【发布时间】:2018-04-12 13:03:05
【问题描述】:

我需要以下情况的输出:

+-----------------+--------+
| STRING in table | OUTPUT |
+-----------------+--------+
| NONGL_NONGL     | NONGL  |
| GL252_GL252     | GL     |
| GL400_GL400     | GL     |
| NOS_NOS         | NOS    |
+-----------------+--------+

我尝试使用SUBSTRING(),但它没有给我正确的输出。

【问题讨论】:

  • 我们需要样本数据和所需的输出,还有你到目前为止尝试了什么
  • 我提供了样本数据。执行 SUBSTRING(COL_NAME,1,CHARINDEX('_',COL_NAME)- 1)

标签: sql sql-server substring


【解决方案1】:

这应该做你想做的:

select (case when col like 'NONGL%' then 'NONGL'
             when col like 'GL%' then 'GL'
             when col like 'NOS%' then 'NOS'
        end) as new_col

【讨论】:

  • 寻找动态解决方案。我有多个案例,但 COL_NAME 的格式相同。
  • @SwapnilV 。 . .只能回答您提出的问题。如果你有不同的问题,你应该问一个有很好的解释、适当的样本数据和期望的结果的问题。投反对票真的很粗鲁,即使它不是来自你。
  • @GordonLinoff 同意
  • 实际上我有多个案例,但模式相同,这就是提供示例案例的原因。会牢记在心。谢谢。
【解决方案2】:

这是另一种方式:

DECLARE @StrTable Table (Str VARCHAR(MAX) );

INSERT INTO @StrTable VALUES
('NONGL_NONGL'),
('GL252_GL252'),
('GL400_GL400'),
('NOS_NOS');

SELECT Str, 
IIF(Str LIKE 'NONGL%','NONGL',IIF(Str LIKE 'GL%', 'GL', IIF(Str LIKE 'NOS%', 'NOS', Str))) AS Outputs
FROM @StrTable;

结果:

+-------------+---------+
|     Str     | Outputs |
+-------------+---------+
| NONGL_NONGL | NONGL   |
| GL252_GL252 | GL      |
| GL400_GL400 | GL      |
| NOS_NOS     | NOS     |
+-------------+---------+

【讨论】:

    【解决方案3】:

    所以对于NONGLNOS 你需要的结果:

    SELECT LEFT([col_name], CHARINDEX('_', [col_name]) - 1)
    

    对于GL 输出,由于字符串包含您需要PATINDEX() 的数字:

    SELECT LEFT([col_name], PATINDEX('%[0-9]%', [col_name]) - 1)
    

    最后只使用CASE WHEN

    DECLARE @tbl Table (string VARCHAR(MAX) );
    
    INSERT INTO @tbl VALUES
    ('NONGL_NONGL'),
    ('GL252_GL252'),
    ('GL400_GL400'),
    ('NOS_NOS');
    
    
    SELECT
        string
        ,CASE WHEN 
            string LIKE '%[0-9]%' then LEFT(string, PATINDEX('%[0-9]%', string) - 1)
            ELSE LEFT(string, CHARINDEX('_', string) - 1)
        END AS [Output]
    from @tbl
    

    【讨论】:

    • 为什么需要SELECT
    • 是的,没用,当我用完整的解决方案编辑答案时,我从上面复制了查询。感谢您指出!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    相关资源
    最近更新 更多