AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 22553
Accepted
peter
peter
Asked: 2012-08-16 13:38:47 +0800 CST2012-08-16 13:38:47 +0800 CST 2012-08-16 13:38:47 +0800 CST

如何删除 SQL 中的前导字符

  • 772

例如,我在 SQL 2012 中有一个表,我们可以将其称为“表”。里面有这样的东西,

Column

_one
_two
three_blah
four_blah

我希望能够做到这一点,

select * from Table order by Column

结果是这样的,

four_blah
one
three_blah
two

因此,它根据删除前导下划线字符对项目进行排序。它不能只是盲目地删除下划线字符,因为下划线可能位于项目的中间。

例如这不起作用,

select Replace(Column, '_', '') from Table order by Replace(Column, '_', '')
sql-server
  • 3 3 个回答
  • 41427 Views

3 个回答

  • Voted
  1. Best Answer
    Aaron Bertrand
    2012-08-16T13:50:02+08:002012-08-16T13:50:02+08:00

    假设 col 限制为 255 个字符,则不必对长度或复杂的 case 表达式进行任何检查:

    SELECT col = SUBSTRING(col, PATINDEX('%[a-z]%', col), 255)
      FROM dbo.table
      ORDER BY col;
    

    更新以显示一个适用于 varchar 的示例,即使我硬编码的值超过了列的大小:

    DECLARE @t TABLE(col VARCHAR(32));
    
    INSERT @t VALUES
    ('_one'),
    ('_two'),
    ('three_blah'),
    ('four_blah');
    
    SELECT col = SUBSTRING(col, PATINDEX('%[A-Za-z]%', col), 255)
      FROM @t
      ORDER BY col;
    

    结果:

    col
    ----------
    four_blah
    one
    three_blah
    two
    

    另一种选择(不需要硬编码字符串的长度或确定表中每个值的长度)是使用 STUFF。请注意,这确实会改变没有单个字母字符的字符串的处理方式(NULL 输出而不是单独存在)。这些行仍将首先排序,只是意义不大。您可以通过添加来处理您喜欢的那些COALESCE。

    SELECT col = STUFF(col, 1, PATINDEX('%[A-Za-z]%', col)-1, '')
      FROM @t
      ORDER BY col;
    

    (这部分答案应该归功于@MikaelEriksson。)

    • 10
  2. miracle173
    2012-08-16T14:46:24+08:002012-08-16T14:46:24+08:00

    以下内容有点棘手,但我发现唯一可以替换字符串头部重复字符的函数是函数 LTRIM。我没有找到任何可以完成这项工作的正则表达式函数(如在其他语言中发现的那样)。

    与当前提出的其他解决方案不同,它可以处理不同数量的前导下划线和包含任意字符的字符串。

    col 应该是列的名称。然后下面的表达式将在每个位置包含一个空格,其中 col 包含一个下划线,表达式包含一个非空格,其中 col 包含一个非下划线(当然可以使用另一个字符而不是 # 除了下划线和空格)

    replace(replace(col,' ','#'),'_',' '))
    

    现在我计算所需字符串的长度:

    len(ltrim(replace(replace(col,' ','#'),'_',' '))))
    

    知道所需字符串的长度可以很容易地使用 RIGHT 从 col 计算所需的字符串

    right(col,len(ltrim(replace(replace(col,' ','#'),'_',' ')))))
    

    编辑:

    现在我找到了另一个表达式来完成这项工作:

    substring(col, PATINDEX('%[^_]%', col), len(col)) /* or optionally replace len(...) with 255 to keep consistent with other solutions in this post i.e. avoid using the len function and use a fixed constant instead */
    

    例如

    ;WITH CTE ([Index], col1) AS (
      SELECT 1 AS [Index], NULL  AS col1 UNION
      SELECT 2 AS [Index], ''    AS col1 UNION
      SELECT 3 AS [Index], 'x'   AS col1 UNION
      SELECT 4 AS [Index], 'x_'  AS col1 UNION
      SELECT 5 AS [Index], '_x'  AS col1 UNION
      SELECT 6 AS [Index], '__x' AS col1
    )
    SELECT [Index], SUBSTRING(col1, PATINDEX('%[^_]%', col1), LEN(col1)) AS Result
    FROM CTE
    ORDER BY [Index]
    

    回报:

    Index|Result
        1|NULL
        2|''
        3|'x'
        4|'x_'
        5|'x'
        6|'x'
    
    • 1
  3. World Wide DBA
    2012-08-16T13:50:31+08:002012-08-16T13:50:31+08:00

    这个怎么样?

    select 
      case 
        when column like '_%' then substring(column, 2, len(column) - 1)
        else column
      end as value
    from table
    order by 1;
    

    这是我的头顶,所以它未经测试......

    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve