使用特殊字符拆分瓦尔查尔列

  • 本文关键字:拆分 特殊字符 sql-server
  • 更新时间 :
  • 英文 :


>我有一列,其值将是

1_987123
12_987654

在这里,我只需要分隔列值中'1''12'的第一个字母。我已经尝试substringcharindex来找到价值。我使用的语法是: substring(Columnname,1,charindex('_',Columnname,1)-1) .

这可以查找具有值的列。但就我而言,我们在列中有空白值。在这种情况下,上述语法会给出错误。尝试了coalesce等场景,并且不接受列数据类型varchar

你能建议我一些其他选择吗?

您需要使用 CASE 表达式来处理不'_'的值:

WITH Tbl(col) AS(
    SELECT '1_987123' UNION ALL
    SELECT '12_987654' UNION ALL
    SELECT '12'
)
SELECT
    CASE
        WHEN CHARINDEX('_', col) > 0 THEN LEFT(col, CHARINDEX('_', col)-1)
        ELSE col
    END
FROM Tbl
或者

你可以通过在后面的下划线上作弊

SELECT LEFT (col, CHARINDEX('_', col + '_') - 1)

你可以这样尝试,它支持空值、不带下划线的值和列中的空字符串值。

SELECT CASE 
        WHEN charindex('_', COL) > 0
            THEN substring(col, 1, charindex('_', COL) - 1)
        ELSE col
        END
FROM (
    VALUES ('1_987123')
        ,('12_987654')
        ,('12')
        ,(NULL)
        ,('')
    ) T(COL)

像这样使用过滤器,

SELECT CASE 
        WHEN charindex('_', COL) > 0
            THEN substring(col, 1, charindex('_', COL) - 1)
        ELSE col
        END
FROM (
    VALUES ('1_987123')
        ,('12_987654')
        ,('12')
        ,(NULL)
        ,('')
        ,('3_545')
        ,('3')
    ) T(COL)
    where col like '3%'

您可以使用一个技巧,从位置 0 而不是位置 1 开始,不要减去 1。当没有下划线时,这将返回空字符串。

SELECT 
  SUBSTRING(Columnname,0,charindex('_',Columnname,1))
FROM (values('1_987123'),('7123'),('12_987654')) x(columnname)

结果:

1
12

最新更新