SQL 截断字符串查询(CharIndex()函数)

SQL 字段charindex,stuff,ltrim, for xml path('') 操作字符串 合并查询结果项值

如:表

CREATE TABLE demo(
demo_id int identity primary key,
demo_name varchar(50)
)

INSERT INTO demo VALUES('房地产开发')
INSERT INTO demo VALUES('房地产经纪/销售')
INSERT INTO demo VALUES('建筑业/工程/施工')

1    房地产开发

2    房地产经纪/销售
3    建筑业/工程/施工

另一表demo_test

CREATE TABLE demo_test(
test_id int identity primary key,
demo_ids varchar(500)
)
INSERT INTO demo_test(demo_ids)VALUES('1,2,3')
INSERT INTO demo_test(demo_ids)VALUES('2,3')

1    1,2,3

2    2,3

的demo_ids 中存储了如:1,2,3

想通过SQL获取demo_ids 对应的demo_name的值

如上想直接用SQL获取demo_test中demo_ids对应的值=>房地产开发,房地产经纪/销售,建筑业/工程/施工

对于用C#代码的话 相信这个没有任何难度就能实现

以下提供sql解决方案:

首先解决获取多个项的问题 这儿使用:charindex

SELECT demo_name FROM demo d WHERE CHARINDEX(CONVERT(VARCHAR,demo_id)+',','1,2,3'+',')>0

这样就获取到了

房地产开发
房地产经纪/销售
建筑业/工程/施工


下一步就是将查询得到的值合并 这儿用到:stuff,ltrim, for xml path('')

SELECT STUFF ((SELECT ',' +Ltrim(demo_name) FROM demo d WHERE CHARINDEX(CONVERT(VARCHAR,demo_id)+',','1,2,3'+',')>0 FOR XML PATH('')),1,1,'')

如上 将两表联合查询就能得到想要的结果:

SELECT dt.test_id,demo_name =
(SELECT STUFF (
    (SELECT ','+LTRIM(d.demo_name) 
     fROM demo d 
     WHERE CHARINDEX(CONVERT(varchar ,d.demo_id)+',',dt.demo_ids+',')>0 
     FOR XML PATH(''))
,1,1,''))FROM demo_test dt

1    房地产开发,房地产经纪/销售,建筑业/工程/施工

2    房地产经纪/销售,建筑业/工程/施工

这样的查询就可以到达预期效果了

补充知识:SQL SUFF使用

1、作用

删除指定长度的字符,并在指定的起点处插入另一组字符。

2、语法

STUFF ( character_expression , start , length ,character_expression )

3、示例

以下示例在第一个字符串 abcdef 中删除从第 2 个位置(字符 b)开始的三个字符,然后在删除的起始位置插入第二个字符串,从而创建并返回一个字符串

SELECT STUFF('abcdef', 2, 3, 'ijklmn')
GO

下面是结果集

aijklmnef

4、参数
character_expression

一个字符数据表达式。character_expression 可以是常量、变量,也可以是字符列或二进制数据列。

start

一个整数值,指定删除和插入的开始位置。如果 start 或 length 为负,则返回空字符串。如果 start 比第一个 character_expression长,则返回空字符串。start 可以是 bigint 类型。

length

一个整数,指定要删除的字符数。如果 length 比第一个 character_expression长,则最多删除到最后一个 character_expression 中的最后一个字符。length 可以是 bigint 类型。

5、返回类型
如果 character_expression 是受支持的字符数据类型,则返回字符数据。如果 character_expression 是一个受支持的 binary 数据类型,则返回二进制数据。

6、备注
如果结果值大于返回类型支持的最大值,则产生错误。

CHARINDEX的使用

CHARINDEX函数返回字符或者字符串在另一个字符串中的起始位置。CHARINDEX函数调用方法如下:

       CHARINDEX ( expression1 , expression2 ,[start_location ] )

       Expression1是要到expression2中寻找的字符中,start_location是CHARINDEX函数开始在expression2中找expression1的位置。

       CHARINDEX函数返回一个整数,返回的整数是要找的字符串在被找的字符串中的位置。假如CHARINDEX没有找到要找的字符串,那么函数整数“0”。让我们看看下面的函数命令执行的结果:

      CHARINDEX('SQL', 'Microsoft SQL Server')

      这个函数命令将返回在“Microsoft SQL Server”中“SQL”的起始位置,在这个例子中,CHARINDEX函数将返回“S”在“Microsoft SQL Server”中的位置11。
接下来,我们看这个CHARINDEX命令:

      CHARINDEX('7.0', 'Microsoft SQL Server 2000')

      在这个例子中,CHARINDEX返回零,因为字符串“7.0” 不能在“Microsoft SQL Server”中被找到。接下来通过两个例子来看看如何使用CHARINDEX函数来解决实际的T-SQL问题。

LTRIM删除起始空格后返回字符表达式。

语法
LTRIM ( character_expression )

参数
character_expression

是字符或二进制数据表达式。character_expression 可以是常量、变量或列。character_expression 必须是可以隐性转换为 varchar 的数据类型。否则,使用 CAST 显式转换 character_expression。

返回类型
varchar

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

示例
下例使用 LTRIM 字符删除字符变量中的起始空格。

DECLARE @string_to_trim varchar(60)SET @string_to_trim = ''     Five spaces are at the beginning of this   string.''SELECT ''Here is the string without the leading spaces: '' +    LTRIM(@string_to_trim)GO
下面是结果集:

------------------------------------------------------------------------Here is the string without the leading spaces: Five spaces are at the beginning of this string.             (1 row(s) affected)

RTRIM截断所有尾随空格后返回一个字符串。

语法
RTRIM ( character_expression )

参数
character_expression

由字符数据组成的表达式。character_expression 可以是常量、变量,也可以是字符或二进制数据的列。

返回类型
varchar

注释
character_expression 必须为可隐性转换为 varchar 的数据类型。否则请使用 CAST 函数显式转换 character_expression。


 

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

示例
下例显示如何使用 RTRIM 删除字符变量中的尾随空格。

DECLARE @string_to_trim varchar(60)SET @string_to_trim = ''Four spaces are after the period in this sentence.    ''SELECT ''Here is the string without the leading spaces: '' + CHAR(13) +   RTRIM(@string_to_trim)GO
下面是结果集:

(1 row(s) affected)------------------------------------------------------------------------ Here is the string without the leading spaces: Four spaces are after the period in this sentence.           (1 row(s) affected)

FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现

风雨苦痛皆营养,欲成大木柱天长。
原文地址:https://www.cnblogs.com/acoll/p/2619420.html