怎么通过sql查询中文字前面的数据?

a2048 2016-01-25 03:10:41
有个字段为a,测试数据如下:

a
123 aabb 上海市火车站
ab 898 ss9999 北京
12345678 天津

我要求查询a字段从左起有中文字开始就截止
怎么通过sql查询效果如下:
a
123 aabb
ab 898 ss9999
12345678
...全文
258 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
echiynn 2016-01-28
  • 打赏
  • 举报
回复
with tb as ( SELECT '123 aabb 上海市火车站51561asf' a UNION ALL SELECT 'ab 898 ss9999 北京asfas' UNION ALL SELECT '12345678 天津fa0' ) select substring(a, 1, patindex(N'%[吖-咗]%' collate Chinese_PRC_CI_AS, a) - 1) from tb
octwind 2016-01-28
  • 打赏
  • 举报
回复
if object_id('splitstr') is not null drop function splitstr go create function splitstr(@string varchar(100)) returns varchar(100) as begin declare @position int set @position = 1 --set @string = '123 aabb 上海市火车站' WHILE @position <= datalength(@string) and ascii(SUBSTRING(@string, @position, 1)) < 127 SET @position = @position + 1 select @string = SUBSTRING(@string, 0, @position) return(@string) end go select col,dbo.splitstr(col) from ( select '123 aabb 上海市火车站' col union all select 'ab 898 ss9999 北京' union all select '12345678 天津' ) t
Ginnnnnnnn 2016-01-26
  • 打赏
  • 举报
回复
;WITH CTE AS
(SELECT
'123 aabb  上海市火车站 990' AS Col1
UNION ALL
SELECT 'ab 898 ss9999 北京aaa'
UNION ALL
SELECT '12345678  天津bbbb'
UNION ALL
SELECT '12345678feaf'
)
SELECT LEFT(CTE.Col1,PATINDEX('%[吖-座]%',CTE.Col1+'吖')-1)
	FROM CTE
-------------------------- 123 aabb ab 898 ss9999 12345678 12345678feaf
zbdzjx 2016-01-26
  • 打赏
  • 举报
回复
如果字串长度不超过1000,试一下这个:
with table1 as
(
SELECT '123 aabb  上海市火车站' id UNION ALL
SELECT 'ab 898 ss9999 北京' UNION ALL
SELECT '12345678  天津'
)
select id,MIN(number)number, SUBSTRING(id,1,min(number)-1) from (
select id,number
from table1 a
, (select number+1 number from master..spt_values where type='P' and number<1000) b
where number<=LEN(a.id)
) aa where DATALENGTH(SUBSTRING(id,number,1))<>1
group by id
a2048 2016-01-25
  • 打赏
  • 举报
回复
我要实现从左起有中文字开始就截止 例如原来数据是: a 123 aabb 上海市火车站 990 ab 898 ss9999 北京aaa 12345678 天津bbbb 要查询的效果是: a 123 aabb ab 898 ss9999 12345678
morliz子轩 2016-01-25
  • 打赏
  • 举报
回复

--方法一:用函数实现
create function [dbo].[m_getchinese](
	@chinese nvarchar(max) )
	returns varchar(100)
	as
	begin
		while PATINDEX('%[^吖-咗]%',@chinese) >0
		begin
			set @chinese = STUFF(@chinese,patindex('%[^吖-咗]%',@chinese),1,N'');
			end
			return @chinese
	end
	GO

--方法二:举例
--> 生成测试数据: @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 行受影响)
*/

薛定谔的DBA 2016-01-25
  • 打赏
  • 举报
回复
--去中文函数
CREATE FUNCTION DBO.GetAlphabet(@S NVARCHAR(100))  
RETURNS VARCHAR(100)  
AS  
BEGIN  
 WHILE PATINDEX('%[吖-座]%',@S) > 0  
 SET @S = STUFF(@S,PATINDEX('%[吖-座]%',@S),1,N'')  
 RETURN @S  
END  
GO  

--测试
CREATE TABLE #TEMP(a NVARCHAR(100))

INSERT INTO #TEMP(a)
SELECT '123 aabb  上海市火车站' UNION ALL
SELECT 'ab 898 ss9999 北京' UNION ALL
SELECT '12345678  天津'

SELECT a,dbo.GetAlphabet(a) FROM #TEMP

34,590

社区成员

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

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