第128章 SQL函数 %SQLSTRING

第128章 SQL函数 %SQLSTRING,第1张

将值排序为字符的排序规则函数。

%SQLSTRING 将表达式转换为按(区分大小写)字符串排序的格式。 %SQLSTRING 从字符串中去除尾随空格(空格、制表符等),然后在字符串的开头添加一个前导空格。这个附加的空格强制将 NULL 和数值作为字符串进行整理。从数字中删除前导零和尾随零。

因为 %SQLSTRING 将空格附加到所有值,所以它将 NULL 值整理为空格,字符串长度为 1 。 %SQLSTRING 将任何仅包含空格(空格、制表符等)的值整理为 SQL 空字符串( '' )。当 %SQLSTRING 将空格附加到空(零长度)字符串时,它会将空格加上空字符串的内部表示形式 $CHAR(0) 进行整理,从而导致字符串长度为 2 。

可选的 maxlen 参数在索引或整理时将表达式字符串截断为指定的字符数。例如,如果插入带有 maxlen 截断的字符串,则插入完整的字符串,并且可以通过 SELECT 语句检索;此字符串的全局索引被截断为指定长度。这意味着 ORDER BY 和比较 *** 作仅评估截断的索引字符串。这种截断对于对超过下标的最大字符长度的字符串进行索引特别有用。使用 maxlen 参数,如果需要对长字段进行索引,可以使用截断长度参数。

%SQLSTRING 在转换表达式后执行 maxlen 截断;如果 maxlen 超过转换后的表达式的长度,则不添加填充。最大字符串长度为 3,641,144 个字符; maxlen 没有强制执行最大值。

可以使用 %SYSTEMUtil 类的 Collation() 方法在 ObjectScript 中执行相同的排序规则转换:

也可以使用 SQLSTRING() 方法调用从 ObjectScript 调用此函数:

这两种方法都支持 SQLSTRING 转换后的截断。请注意,截断长度必须包括附加的空白:

注意:要将系统范围的默认排序规则从 %SQLUPPER (不区分大小写)更改为 %SQLSTRING (区分大小写),请使用以下命令:

发出此命令后,必须清除索引,重新编译所有类,然后重建索引。不要在其他用户访问表的数据时重建索引。这样做可能会导致查询结果不准确。

以下查询在 WHERE 子句中使用 %SQLSTRING 来执行区分大小写的选择:

默认情况下, %STARTSWITH 字符串比较不区分大小写。此示例使用 %SQLSTRING 格式使此比较区分大小写。它返回所有以 “Al” 开头的名称(例如 Allen 、 Alton 等)。请注意,使用 %STARTSWITH 时,应将 %SQLSTRING 排序规则应用于语句的两侧。

以下示例使用带有字符串截断的 %SQLSTRING 来返回每个名称的前两个字符。请注意,字符串截断是 3 (不是 2 ),因为 %SQLSTRING 添加了前导空格。 ORDER BY 子句使用这个两个字符的字段将行放在一个粗略的排序顺序中:

此示例在不更改字母大小写的情况下返回截断的值。

以下示例将 %SQLSTRING 应用于子查询:

--1ASCII返回字符表达式中最左侧的字符的 ASCII 代码值

SELECT ASCII('A'),ASCII(' '),ASCII('@'),ASCII('黄')

--结果:65 32 64 187

--2CHAR将 int ASCII 代码转换为字符,0 到 255 之间的整数。如果整数表达式不在此范围内,则返回 NULL

SELECT CHAR(65),CHAR(32),CHAR(64),CHAR(187)

--结果:A @ NULL

--3QUOTENAME返回带有分隔符的 Unicode 字符串,分隔符的加入可使输入的字符串成为有效的 SQL Server 分隔标识符

SELECT QUOTENAME('COLUMN') --[COLUMN]

1、首先创建模拟数据源表。

2、接着插入需要的插入的模拟数据。

3、定义变量,模拟需要动态获取的列名。

4、执行动态SQL查询:表#table1的@colname列,同时满足code=@code的结果。

5、查找包含某些字符的列的查询效果如下。

根据需求,写了一段方法。 用于识别以下的情况: 判断 字符串A 在用逗号分隔的字符串B中是否存在如: v_str_a = aa ; v_str_b= aa,bb,dd,cc ; 如上,就返回Y,否则返回N 添加了一些校验。 以后可以根据需求,按照指定的分隔符,提取字符串。 毕竟Oracle的字符串解析比较麻烦,能封装就封装。 Sql代码 create or replace function func_str_inArray(p_target varchar2, p_str_array varchar2) return varchar2 is v_flag varchar2(1); v_comma_loc int; v_cut_string varchar2(300); v_rest_string varchar2(2000); begin ------------------------ --p_target 不能包含","!!!注意!! --info:这个函数用于识别目标字符串,是否在一串用","分开的字符串内 ------------------------ v_flag := 'N'; v_comma_loc := instr(p_str_array, ','); --如果是对比字符串是空,则返回false if nvl(p_str_array, '') = '' then return 'N'; end if; --如果没有逗号,直接比较 if length(p_str_array) > 0 and v_comma_loc = 0 then if p_target = p_str_array then return 'Y'; else return 'N'; end if; end if; v_rest_string := p_str_array; while v_comma_loc > 0 loop v_cut_string := substr(v_rest_string, 0, v_comma_loc - 1); v_rest_string := substr(v_rest_string, v_comma_loc + 1, length(v_rest_string) - 1); if p_target = v_cut_string then v_flag := 'Y'; end if; v_comma_loc := instr(v_rest_string, ','); if v_comma_loc = 0 and length(v_rest_string) > 0 then if p_target = v_rest_string then v_flag := 'Y'; end if; end if; end loop; return v_flag; end;

1、既然你要判断其中一个是否包含了另一个,那你条件肯定要给SQL,SQL才能帮你找到的,2、这个条件肯定是你要给出的。比如str1='1`2`3`4`5'str2='1`2`3`4'那你叫SQL判断的其中的话,可以:Select

CharIndex('5',str1)

--这里的“5”具体要代入什么值去判断,就要你给出来了。Select

CharIndex('2`3',str1)

--这类的SQL是可以帮你去判断的。不包含的话就返回0否则就返回第一个相同字符的位置,比如这个就返回3 给你写一个函数来 *** 作:

Create

function

fSearch(@inStr

varchar(1000),@fndStr

varchar(1000),@doc

varchar(10))

returns

bit

as

begin

declare

@ii

int,@rStr

varchar(1000),@c

varchar(1000)

select

@rStr=@fndStr

while

len(@rStr)>0

begin

Select

@ii=Charindex(@doc,@rStr)

if

@ii=0

begin

return

0

end

else

begin

select

@c=substring(@rStr,1,@ii-1)

if

charIndex(@c,@inStr)>0

return

1

else

begin

select

@rStr=substring(@rStr,@ii+len(@doc),len(@rStr))

end

end

end

return

0

end

--参数:@inStr

待搜索字串,@fndStr

搜索字串,@doc

分隔符--

例:select

dbofSearch('1,2,3,4,5,6','3,6,5,8,2',',')

返回0-不匹配,返回1-匹配(@instr中有@fndStr内容)--可以用于表搜索,如:--

Select

,dbofSearch(str,'3,6,5,8,2',',')

as

是否匹配 from

表名--

@fndStr和@doc两个参数就需要你自己提供了,@inStr可以是数据表里的某个待搜索字段名

  SQL截取字符串函数:

  A截取从字符串左边开始N个字符

  以下是代码片段:

Declare @S1 varchar(100)

  Select @S1='http://wwwxrsscn'

  Select Left(@S1,4)

  ------------------------------------

  显示结果: http

  B截取从字符串右边开始N个字符(例如取字符www163com)

  以下是代码片段:

Declare @S1 varchar(100)

  Select @S1='http://www163com'

  Select right(@S1,11)

  ------------------------------------

  显示结果: www163com

  C截取字符串中任意位置及长度(例如取字符www)

  以下是代码片段:

Declare @S1 varchar(100)

  Select @S1='http://wwwxrsscn'

  Select SUBSTRING(@S1,8,3)

  ------------------------------------

  显示结果: www

  以上例子皆是已知截取位置及长度,下面介绍未知位置的例子

  2截取未知位置的函数

  A截取指定字符串后的字符串(例如截取http://后面的字符串)

  方法一:

  以下是代码片段:

Declare @S1 varchar(100)

  Select @S1='http://wwwxrsscn'

  Select Substring(@S1,CHARINDEX('www',@S1)+1,Len(@S1))

  

  ------------------------------------

  显示结果: www163com

  需要注意:CHARINDEX函数搜索字符串时,不区分大小写,因此CHARINDEX('www',@S1)也可以写成CHARINDEX('WWW',@S1)

  方法二:(与方法一类似)

  以下是代码片段:

Declare @S1 varchar(100)

  Select @S1='http://wwwxrsscn'

  Select Substring(@S1,PATINDEX('%www%',@S1)+1,Len(@S1))

  --此处也可以这样写:Select

Substring(@S1,PATINDEX('%//%',@S1)+2,Len(@S1))

  ------------------------------------

  显示结果: www163com

  函数PATINDEX与CHARINDEX区别在于:前者可以参数一些参数,增加查询的功能

  方法三:

  以下是代码片段:

Declare @S1 varchar(100)

  Select @S1='http://wwwxrsscn'

  Select REPLACE(@S1,'http://','')

  ------------------------------------

  显示结果: www163com

  利用字符替换函数REPLACE,将除需要显示字符串外的字符替换为空

  方法四:

  以下是代码片段:

Declare @S1 varchar(100)

  Select @S1='http://wwwxrsscn'

  Select

STUFF(@S1,CHARINDEX('http://',@S1),Len('http://'),'')

  ------------------------------------

  显示结果: www163com

  函数STUFF与REPLACE区别在于:前者可以指定替换范围,而后者则是全部范围内替换

  B截取指定字符后的字符串(例如截取C:\Windows\testtxt中文件名)

  与A不同的是,当搜索对象不是一个时,利用上面的方法只能搜索到第一个位置

  方法一:

  以下是代码片段:

Declare @S1 varchar(100)

  Select @S1='C:\Windows\testtxt'

  select right(@S1,charindex('\',REVERSE(@S1))-1)

  -------------------------------------

  显示结果: texttxt

  利用函数REVERSE获取需要截取的字符串长度

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/12184371.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存