zoukankan      html  css  js  c++  java
  • 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形式展现

    风雨苦痛皆营养,欲成大木柱天长。
  • 相关阅读:
    跑Linux内存占用率的shell脚本
    Mysql数据导入导出功能(设置及使用)
    Python刷CSDN阅读数(仅供娱乐)
    SSH、SCP命令及使用说明
    2020.6.7 时间记录
    3年经验,中级Java开发招聘信息
    中级Java程序员要求
    提升自身内部核心竞争力要素
    三级联动页面
    大公司和小公司程序员
  • 原文地址:https://www.cnblogs.com/acoll/p/2619420.html
Copyright © 2011-2022 走看看