取出字段内容中的汉子

cao_weiqi 2009-10-22 05:12:44
有一些记录在某个字段里,能不能设计出一个函数只取到字段内容中的汉字,
比方

ID Content
1 abcd测试efg
2 zzzz大家好yyy
3 谢谢test


select id,dbo.hanzi(content) from table 最终结果是:

1 测试
2 大家好
3 谢谢
...全文
139 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
rfq 2009-10-23
  • 打赏
  • 举报
回复
alter function getChina(@str nvarchar(1000))
returns nvarchar(1000)
as
begin
declare @strall nvarchar(1000)
set @strall=''
declare @inti int
set @inti=0
declare @strTemp nvarchar(100)
set @strTemp=''
while(@inti<=len(@str)-1)
begin
set @strTemp=substring(@str,@inti,1)
if @strTemp like '%[吖-做]%'
set @strall=@strall+@strTemp
set @inti=@inti+1
end
return @strall

end
select dbo.getChina('as阿得发抖d')
贝隆 2009-10-22
  • 打赏
  • 举报
回复
学习
叶子 2009-10-22
  • 打赏
  • 举报
回复

/************************************************/
/*<summary>取出字符串中的汉字</summary>**********/
/*function:m_getchinese**************************/
/*author:maco_wang*******************************/
/*createtime:2008-11-19**************************/
/*<param name="@str">输入的字符串</param>****/
/************************************************/

create function [dbo].[m_getchinese]
(
@chinese nvarchar(100)
)
returns varchar(100)
as
begin
--begin while
while patindex('%[^吖-咗]%',@chinese) > 0
begin
set @chinese = stuff(@chinese,patindex('%[^吖-咗]%',@chinese),1,N'');
end
--end while
return @chinese
end

declare @table table (ID int,Content varchar(13))
insert into @table
select 1,'abcd测试efg' union all
select 2,'zzzz大家好yyy' union all
select 3,'谢谢test'

select ID,dbo.m_getchinese(Content) as Content from @table

/*
ID Content
----------- ----------
1 测试
2 大家好
3 谢谢
*/
小宏 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 dawugui 的回复:]
引用 3 楼 happyandsad 的回复:
SQL codecreatefunction getnewstr1(@oldstrvarchar(100))returnsvarchar(100)asbegindeclare@iintset@i=1while@i <=len(@oldstr)ifsubstring(@oldstr,@i,1)like('[^0-9]')set@oldstr=replace(@oldstr,substring(@oldstr,@i,1),'')elseset@i=@i+1return@oldstrendgo--建立如下函数(非吖-做,之外的字符删除)gocreatefunction getnewstr2(@oldstrvarchar(100))returnsvarchar(100)asbegindeclare@iintset@i=1while@i <=len(@oldstr)ifsubstring(@oldstr,@i,1)like('[^吖-做]')set@oldstr=replace(@oldstr,substring(@oldstr,@i,1),'')elseset@i=@i+1return@oldstrend
这是上次我看到CSDN里面一个牛人写的,我忘记是谁了。。。⊙﹏⊙b汗

我的吧?
[/Quote]
向乌龟哥学习
feixianxxx 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liangck 的回复:]
SQL code-------------------------------------
-- Author : liangCK 梁爱兰
-- Comment: 小梁 爱 兰儿
-- Date : 2009-10-22 17:16:19
---------------------------------------> 生成测试数据: @tbDECLARE@tbTABLE (IDint,¡­
[/Quote]
。。。。。
nzperfect 2009-10-22
  • 打赏
  • 举报
回复
事实上哪个都不准.只能近似
nzperfect 2009-10-22
  • 打赏
  • 举报
回复
declare @s nvarchar(2000)
set @s='呵中並丧呵ab䈩c座鱇咘咗쥅䶮123abc'
while patindex('%[^吖-座]%',@s) > 0
set @s = stuff(@s,patindex('%[^吖-座]%',@s),1,N'')
select @s,len(@s)
/*
呵中並丧呵座鱇咘 8
*/

declare @s nvarchar(2000)
set @s='呵中並丧呵ab䈩c座鱇咘咗쥅䶮123abc'
while patindex('%[^吖-咗]%',@s) > 0
set @s = stuff(@s,patindex('%[^吖-咗]%',@s),1,N'')
select @s,len(@s)
/*
呵中並丧呵座鱇咘咗 9
*/

肉眼结果:
/*
呵中並丧呵䈩座鱇咘咗䶮 11
*/
dawugui 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wzy_love_sly 的回复:]
[吖-咗]应该是准确点,去年大叔测试过一次
[/Quote]
正确
dawugui 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 happyandsad 的回复:]
SQL codecreatefunction getnewstr1(@oldstrvarchar(100))returnsvarchar(100)asbegindeclare@iintset@i=1while@i<=len(@oldstr)ifsubstring(@oldstr,@i,1)like('[^0-9]')set@oldstr=replace(@oldstr,substring(@oldstr,@i,1),'')elseset@i=@i+1return@oldstrendgo--建立如下函数(非吖-做,之外的字符删除)gocreatefunction getnewstr2(@oldstrvarchar(100))returnsvarchar(100)asbegindeclare@iintset@i=1while@i<=len(@oldstr)ifsubstring(@oldstr,@i,1)like('[^吖-做]')set@oldstr=replace(@oldstr,substring(@oldstr,@i,1),'')elseset@i=@i+1return@oldstrend
这是上次我看到CSDN里面一个牛人写的,我忘记是谁了。。。⊙﹏⊙b汗
[/Quote]
我的吧?
百年树人 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 josy 的回复:]
向大大和大叔学习一下
SQL codecreatefunction hanzi(@svarchar(100))returnsvarchar(100)asbegindeclare@strvarchar(100)while (patindex('%[^吖-咗]%',left(ltrim(@s),1))>0)beginset@s=stuff(@s,1,patindex('%[吖-咗]%',@s)-1,'')set@str=isnull(@str,'')+isnull(left(@s,patindex('%[^吖-咗]%',@s)-1),'')set@s=stuff(@s,1,patindex('%[^吖-咗]%',@s)-1,'')endreturn@strendgoselect dbo.hanzi('abcd测试efg通过xyz')/**
----------------------------------------------------------------------------------------------------
测试通过

(1 行受影响)
**/
[/Quote]
中文结尾的会有问题,改一下
create function hanzi(@s varchar(100))
returns varchar(100)
as
begin
declare @str varchar(100)
set @s=@s+'s'
while (patindex('%[^吖-咗]%',left(ltrim(@s),1))>0)
begin
set @s=stuff(@s,1,patindex('%[吖-咗]%',@s)-1,'')
set @str=isnull(@str,'')+isnull(left(@s,patindex('%[^吖-咗]%',@s)-1),'')
set @s=stuff(@s,1,patindex('%[^吖-咗]%',@s)-1,'')
end
return @str
end
go
百年树人 2009-10-22
  • 打赏
  • 举报
回复
向大大和大叔学习一下
create function hanzi(@s varchar(100))
returns varchar(100)
as
begin
declare @str varchar(100)
while (patindex('%[^吖-咗]%',left(ltrim(@s),1))>0)
begin
set @s=stuff(@s,1,patindex('%[吖-咗]%',@s)-1,'')
set @str=isnull(@str,'')+isnull(left(@s,patindex('%[^吖-咗]%',@s)-1),'')
set @s=stuff(@s,1,patindex('%[^吖-咗]%',@s)-1,'')
end
return @str
end
go

select dbo.hanzi('abcd测试efg通过xyz')
/**

----------------------------------------------------------------------------------------------------
测试通过

(1 行受影响)
**/
wzy_love_sly 2009-10-22
  • 打赏
  • 举报
回复
[吖-咗]应该是准确点,去年大叔测试过一次
pt1314917 2009-10-22
  • 打赏
  • 举报
回复
--> 测试数据: [s]
if object_id('[s]') is not null drop table [s]
create table [s] (ID int,Content varchar(13))
insert into [s]
select 1,'abcd测试efg' union all
select 2,'zzzz家好yy大y' union all
select 3,'谢谢test'
go


create function hanzi(@text varchar(100))
returns varchar(100)
as
begin
declare @new varchar(1500)
while(patindex('%[吖-咗]%',@text)>0)
begin
set @new=isnull(@new,'')+substring(@text,patindex('%[吖-咗]%',@text),1)
set @text=substring(@text,patindex('%[吖-咗]%',@text)+1,len(@text))
end
return @new
end
go


select content=dbo.hanzi(content) from [s]
--小F-- 2009-10-22
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author :fredrickhu(我是小F,向高手学习)
-- Date :2009-10-22 17:14:36
-- Version:
-- Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
-- Nov 24 2008 13:01:59
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([ID] int,[Content] varchar(13))
insert [tb]
select 1,'abcd测试efg' union all
select 2,'zzzz大家好yyy' union all
select 3,'谢谢test'
--------------开始查询--------------------------
IF OBJECT_ID('DBO.CHINA_STR') IS NOT NULL
DROP FUNCTION DBO.CHINA_STR
GO
CREATE FUNCTION DBO.CHINA_STR(@S NVARCHAR(100))
RETURNS VARCHAR(100)
AS
BEGIN
WHILE PATINDEX('%[^吖-座]%',@S) > 0
SET @S = STUFF(@S,PATINDEX('%[^吖-座]%',@S),1,N'')
RETURN @S
END
GO
select id,[Content]=DBO.CHINA_STR([Content]) from tb
GO

----------------结果----------------------------
/* ----------- ----------------------------------------------------------------------------------------------------
1 测试
2 大家好
3 谢谢

(3 行受影响)

*/
小宏 2009-10-22
  • 打赏
  • 举报
回复
修改一下就可以了
liangCK 2009-10-22
  • 打赏
  • 举报
回复
-------------------------------------
-- Author : liangCK 梁爱兰
-- Comment: 小梁 爱 兰儿
-- Date : 2009-10-22 17:16:19
-------------------------------------

--> 生成测试数据: @tb
DECLARE @tb TABLE (ID int,Content varchar(13))
INSERT INTO @tb
SELECT 1,'abcd测试efg' UNION ALL
SELECT 2,'zzzz大家好yyy' UNION ALL
SELECT 3,'谢谢test'

--SQL查询如下:

SELECT *
FROM @tb AS A
OUTER APPLY (SELECT x=(SELECT SUBSTRING(A.Content,number,1) AS [text()]
FROM master.dbo.spt_values
WHERE type = 'p' AND SUBSTRING(A.Content,number,1)<>''
AND SUBSTRING(A.Content,number,1) LIKE '%[吖-做]%'
FOR XML PATH(''),TYPE).value('.','varchar(500)')) AS B

/*
ID Content x
----------- ------------- ---------------------------
1 abcd测试efg 测试
2 zzzz大家好yyy 大家好
3 谢谢test 谢谢

(3 行受影响)
*/
wzy_love_sly 2009-10-22
  • 打赏
  • 举报
回复

create function get_china(@s varchar(50))
returns varchar(50)
as
begin
declare @i int
set @i=1
while patindex('%[^吖-座]%',@s) > 0 and @i<=len(@s)
begin
if substring(@s,@i,1) not like '%[吖-座]%'
set @s=stuff(@s,@i,1,'')
else
set @i=@i+1
end
return @s
end

if object_id('tb') is not null
drop table tb
go
create table tb(name varchar(1000))
insert into tb select 'asdas啊das'
insert into tb select 'asda爱是sdas'
insert into tb select '1423啊124'
insert into tb select 'asdsa123阿斯顿4r13'
insert into tb select '撒旦阿斯顿123座位41'


select dbo.get_china(name) as name from tb


小宏 2009-10-22
  • 打赏
  • 举报
回复

create function getnewstr1(@oldstr varchar(100)) returns varchar(100)
as
begin
declare @i int
set @i = 1
while @i <= len(@oldstr)
if substring(@oldstr, @i, 1) like('[^0-9]')
set @oldstr = replace(@oldstr, substring(@oldstr, @i, 1), '')
else
set @i = @i +1
return @oldstr
end
go
--建立如下函数(非吖-做,之外的字符删除)
go
create function getnewstr2(@oldstr varchar(100)) returns varchar(100)
as
begin
declare @i int
set @i = 1
while @i <= len(@oldstr)
if substring(@oldstr, @i, 1) like('[^吖-做]')
set @oldstr = replace(@oldstr, substring(@oldstr, @i, 1), '')
else
set @i = @i +1
return @oldstr
end


这是上次我看到CSDN里面一个牛人写的,我忘记是谁了。。。⊙﹏⊙b汗
--小F-- 2009-10-22
  • 打赏
  • 举报
回复
晕 有问题 不好意思
--小F-- 2009-10-22
  • 打赏
  • 举报
回复
select * from tb where PATINDEX('%[吖-做]%',Content)>0

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧