SubString函数

sql substring函数返回字符、binary、text 或 image 表达式的一部分。有关sql substring函数可与该函数一起使用的有效 Microsoft® SQL Server™ 数据类型的更多信息,请参见数据类型

语法

SUBSTRING expression , start , length   
参数

expression     

是字符串、二进制字符串、text、image、列或包含列的表达式。不要使用包含聚合函数的表达式。  

start

是一个整数,指定子串的开始位置。

length

是一个整数,指定子串的长度(要返回的字符数或字节数)。     

说明   由于在 text 数据上使用 SUBSTRING 时 start 和 length 指定字节数,因此 DBCS 数据(如日本汉字)可能导致在结果的开始或结束位置拆分字符。此行为与 READTEXT 处理 DBCS 的方式一致。然而,由于偶而会出现奇怪的结果,建议对 DBCS 字符使用 ntext 而非text。   

返回类型

如果 expression 是支持的字符数据类型,则返回字符数据。如果 expression 是支持的 binary 数据类型,则返回二进制数据。   

返回字符串的类型与给定表达式的类型相同(表中显示的除外)。       

给定的表达式返回类型
text varchar
image varbinary
ntext nvarchar
    

注释

在字符数中必须指定使用 ntextchar 或 varchar 数据类型的偏移量(start 和 length)。在字节数中必须指定使用textimagebinary 或 varbinary 数据类型的偏移量。     

说明   兼容级别可能影响返回值。有关兼容级别的更多信息,请参见 sp_dbcmptlevel。  

示例
A. 在字符串上使用 SUBSTRING     

下例显示如何只返回字符串的一部分。该查询在一列中返回 authors 表中的姓氏,在另一列中返回 authors 表中的名字首字母。

USE pubs
        SELECT au_lname, SUBSTRING(au_fname, 1, 1)
        FROM authors
        ORDER BY au_lname
下面是结果集:
au_lname                                       
        ---------------------------------------- - 
        Bennet                                       A 
        Blotchet-Halls                               R 
        Carson                                       C 
        DeFrance                                     M 
        del Castillo                                 I 
        ...
        Yokomoto                                     A 
        
        (23 row(s) affected)
    

下例显示如何显示字符串常量 abcdef 中的第二个、第三个和第四个字符。

SELECT x = SUBSTRING('abcdef', 2, 3)
    
下面是结果集:
x
        ----------
        bcd
        
        (1 row(s) affected)
    
       
B. 在 text、ntext 和 image 数据上使用 SUBSTRING

下例显示如何从 pubs 数据库的 publishers 表内的每个 text 和 image 数据列中返回前 200 个字符。text 数据以 varchar 的形式返回,image 数据则以 varbinary 的形式返回。

USE pubs
        SELECT pub_id, SUBSTRING(logo, 1, 10) AS logo, 
           SUBSTRING(pr_info, 1, 10) AS pr_info
        FROM pub_info
        WHERE pub_id = '1756'   

下面是结果集:

pub_id logo                       pr_info        
        ------ ---------------------- ---------- 
        1756       0x474946383961E3002500 This is sa
        
        (1 row(s) affected)
        

下例显示 SUBSTRING 在 text 和 ntext 数据上的效果。首先,下例在 pubs 数据库内创建一个名为 npr_info 的新表。然后,在npr_info 表中用 pub_info.pr_info 列的前 80 个字符创建 pr_info 列,并添加ü作为首字符。最后,INNER JOIN 检索所有出版商标识号以及 text 和 ntext 出版商信息列的 SUBSTRING。

IF EXISTS (SELECT table_name FROM INFORMATION_SCHEMA.TABLES 
              WHERE table_name = 'npub_info')
           DROP TABLE npub_info
        GO
        -- Create npub_info table in pubs database. Borrowed from instpubs.sql.
        USE pubs
        GO
        CREATE TABLE npub_info
        (
         pub_id             char(4)               NOT NULL
                 REFERENCES publishers(pub_id)
                 CONSTRAINT UPKCL_npubinfo PRIMARY KEY CLUSTERED,
         pr_info            ntext                 NULL
        )
        
        GO
        
        -- Fill the pr_info column in npub_info with international data.
        RAISERROR('Now at the inserts to pub_info...',0,1)
        
        GO
        
        INSERT npub_info VALUES('0736', N'üThis is sample text data for New Moon Books, publisher 0736 in the pubs database')
        INSERT npub_info values('0877', N'üThis is sample text data for Binnet & Hardley, publisher 0877 in the pubs databa')
        INSERT npub_info values('1389', N'üThis is sample text data for Algodata Infosystems, publisher 1389 in the pubs da')
        INSERT npub_info values('9952', N'üThis is sample text data for Scootney Books, publisher 9952 in the pubs database')
        INSERT npub_info values('1622', N'üThis is sample text data for Five Lakes Publishing, publisher 1622 in the pubs d')
        INSERT npub_info values('1756', N'üThis is sample text data for Ramona Publishers, publisher 1756 in the pubs datab')
        INSERT npub_info values('9901', N'üThis is sample text data for GGG&G, publisher 9901 in the pubs database. GGG&G i')
        INSERT npub_info values('9999', N'üThis is sample text data for Lucerne Publishing, publisher 9999 in the pubs data')
        GO
        -- Join between npub_info and pub_info on pub_id.
        SELECT pr.pub_id, SUBSTRING(pr.pr_info, 1, 35) AS pr_info,
           SUBSTRING(npr.pr_info, 1, 35) AS npr_info
        FROM pub_info pr INNER JOIN npub_info npr
           ON pr.pub_id = npr.pub_id
        ORDER BY pr.pub_id ASC
    

     select SUBSTRING(date_entered,1,4)   as a from tb_area_collect   group by SUBSTRING(date_entered,1,4)

Edit by jhfcjl

<think> 我们被要求解释SUBSTRING函数的使用方法和详细介绍。根据引用[2]和引用[3],我们可以知道SUBSTRING函数在MySQL和Arduino中的使用方式。此外,引用[4]展示了在Java中类似功能的实现(虽然用的是substring,没有下划线)。注意,不同编程语言和数据库中的SUBSTRING函数可能有细微差别。 我们将从以下几个方面介绍: 1. 函数功能:SUBSTRING用于从字符串中提取子字符串。 2. 语法:在不同环境中的语法格式。 3. 参数说明。 4. 示例。 注意:在SQL中,SUBSTRING和SUBSTR是等价的,但在其他语言中可能只有一种形式。 根据引用[2](MySQL): - SUBSTRING(s, start, length)SUBSTRING(s FROM start FOR length) - 参数s是原始字符串,start是开始位置(索引从1开始,如果为负数则表示从末尾倒数),length是可选参数,表示截取的长度。 根据引用[3](Arduino,实际上是C++的String类): - substring(from):从索引from开始到字符串末尾。 - substring(from, to):从索引from开始到to(不包括to)。 另外,在SQL中还有一个SUBSTRING_INDEX函数(引用[2]和引用[4]提到),用于按分隔符截取字符串。 我们分别介绍: 一、SQL中的SUBSTRING函数(以MySQL为例) 语法: SUBSTRING(string, start, length) SUBSTRING(string FROM start FOR length) [标准SQL语法] 参数: string: 要提取的字符串。 start: 起始位置(整数)。如果为正数,则从字符串开头计数;如果为负数,则从字符串结尾倒数。 length: 可选,要提取的字符数。如果省略,则返回从start开始到末尾的所有字符。 示例: 1. 从第2个字符开始,提取3个字符: SELECT SUBSTRING('Hello World', 2, 3); -- 输出 'ell' 2. 从倒数第3个字符开始,提取2个字符: SELECT SUBSTRING('Hello World', -3, 2); -- 输出 'rl' 3. 从第4个字符开始到结束: SELECT SUBSTRING('Hello World', 4); -- 输出 'lo World' 二、SQL中的SUBSTRING_INDEX函数 功能:根据指定的分隔符截取字符串。 语法:SUBSTRING_INDEX(str, delim, count) 参数: str: 原始字符串 delim: 分隔符(字符串) count: 计数(整数)。如果为正数,则返回从左边开始到第count个分隔符左边的所有内容;如果为负数,则返回从右边开始到第count个分隔符右边的所有内容。 示例: 1. 获取第一个'.'之前的部分: SELECT SUBSTRING_INDEX('www.example.com', '.', 1); -- 'www' 2. 获取最后一个'.'之后的部分: SELECT SUBSTRING_INDEX('www.example.com', '.', -1); -- 'com' 3. 获取前两个'.'之间的部分(不包括第一个分隔符和第二个分隔符之后): SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('www.example.com', '.', 2), '.', -1); -- 'example' 三、在编程语言中(以Java为例,参考引用[4]) 在Java中,String类有substring方法(注意:Java中是substring,不是sub_string,也没有下划线): - public String substring(int beginIndex) - public String substring(int beginIndex, int endIndex) 参数: beginIndex: 开始索引(包括),索引从0开始。 endIndex: 结束索引(不包括)。 示例: String str = "Hello World"; str.substring(1, 4); // "ell" str.substring(6); // "World" 注意:在Java中,如果索引超出范围会抛出StringIndexOutOfBoundsException。 四、在Arduino(C++)中(引用[3]) 语法: String.substring(from) String.substring(from, to) 示例: String myString = "Hello World"; myString.substring(1); // 结果为"ello World" myString.substring(0,5); // 结果为"Hello" 五、在R语言中(引用[1]提到grepl,但这里补充substr) 在R中,substr函数用于提取子字符串: substr(x, start, stop) 示例: x <- "Hello World" substr(x, 1, 5) # 输出 "Hello" 六、JavaScript中的substring 字符串的substring(startIndex, endIndex)方法,注意与slice的区别。 总结:SUBSTRING函数(或类似名称的函数)在多种环境中存在,用于提取子字符串。使用时需注意: - 索引开始位置(0还是1) - 参数含义(是否有长度参数还是结束位置) - 索引为负数的处理(有些环境支持负数索引,有些不支持) 最后,我们给出相关问题。 </think> ### SUBSTRING 函数详解 #### 1. 核心功能 SUBSTRING 函数用于从字符串中**提取指定部分的子字符串**。主要功能包括: - 按位置提取字符序列 - 支持正向/反向索引定位 - 控制截取长度 #### 2. 基本语法 ```sql SUBSTRING(string, start_position [, length]) ``` - **string**:原始字符串 - **start_position**:起始位置(正整数从左向右,**负整数从右向左**) - **length**:可选,截取长度(缺省时截取到末尾) --- ### 三、使用场景与示例 #### 场景 1:正向截取(MySQL) ```sql -- 从第 3 个字符开始截取 5 个字符 SELECT SUBSTRING('Hello World', 3, 5); -- 结果: "llo W" ``` #### 场景 2:反向截取(MySQL) ```sql -- 从倒数第 4 个字符开始截取到末尾 SELECT SUBSTRING('Database', -4); -- 结果: "base" ``` #### 场景 3:编程语言实现(Java) ```java // 提取"街道"前的字符串 String address = "人民东路街道xxxxxx"; int index = address.indexOf("街道"); String result = address.substring(0, index) + "街道"; // 结果: "人民东路街道" ``` > 参考引用[4] #### 场景 4:硬件开发(Arduino) ```cpp String myString = "SensorData:25.6C"; float temp = myString.substring(11, 15).toFloat(); // 提取温度值 25.6 ``` > 参考引用[3] --- ### 四、特殊函数变体 #### 1. SUBSTRING_INDEX(MySQL 专属) 按分隔符截取字符串: ```sql -- 截取第一个'.'前的部分 SELECT SUBSTRING_INDEX('www.example.com', '.', 1); -- 结果: "www" -- 截取最后一个'.'后的部分 SELECT SUBSTRING_INDEX('www.example.com', '.', -1); -- 结果: "com" ``` > 参考引用[2] #### 2. 正则替代方案(R 语言) 当需要模式匹配时可用 `grepl`: ```r grepl("hello", "hello world") # 返回 TRUE ``` > 参考引用[1] --- ### 五、注意事项 1. **索引基准** - SQL:起始位置通常为 **1**(不是 0) - Java/Arduino:起始位置为 **0** 2. **越界处理** - 超范围时 MySQL 返回空字符串"" - Java 抛出 `StringIndexOutOfBoundsException` 3. **性能优化** - 对长文本避免频繁截取,优先用正则过滤 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值