sql 中文字符串补足的问题

zwk_9 2011-11-10 07:30:51
表里面的数据是这样的:
1 A 三轮 1.0 次 NULL
2 B 货的(皮卡) 2.0 次 NULL
4 C 拖拉机 3.0 次 NULL
5 D 箱式车 5.0 次 NULL
6 E 中卡车 10.0 次 NULL
7 F 大卡车 15.0 次 NULL
8 G 集装箱(后四轮) 20.0 次 NULL
9 H 大型集装箱(后八轮) 30.0 次 NULL
10 I 手拉车 0.0 次 NULL

我实现这么一个查询:
select Id, left(Flag + replicate(' ', 5), 5) + left(CarTypeName + replicate(' ', 15), 15)
+ CarTypeMoney + '/' + StopTime
as CarType from CarTypeTBL

结果是这样的:
1 A 三轮 1.0/次
2 B 货的(皮卡) 2.0/次
4 C 拖拉机 3.0/次
5 D 箱式车 5.0/次
6 E 中卡车 10.0/次
7 F 大卡车 15.0/次
8 G 集装箱(后四轮) 20.0/次
9 H 大型集装箱(后八轮) 30.0/次
10 I 手拉车 0.0/次

我希望这里的最后一列能对对齐,有什么好办法么?
...全文
166 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
koumingjie 2011-11-10
  • 打赏
  • 举报
回复



--全角转半角
Create FUNCTION [dbo].[f_Convert](

@str NVARCHAR(4000), --要转换的字符串

@flag bit --转换标志,0转换成半角,1转换成全角

)RETURNS nvarchar(4000)

AS

BEGIN

DECLARE @pat nvarchar(8),@step int,@i int,@spc int

IF @flag=0

SELECT @pat=N'%[!-~]%',@step=-65248,

@str=REPLACE(@str,N' ',N' ')

ELSE

SELECT @pat=N'%[!-~]%',@step=65248,

@str=REPLACE(@str,N' ',N' ')

SET @i=PATINDEX(@pat COLLATE LATIN1_GENERAL_BIN,@str)

WHILE @i>0

SELECT @str=REPLACE(@str,

SUBSTRING(@str,@i,1),

NCHAR(UNICODE(SUBSTRING(@str,@i,1))+@step))

,@i=PATINDEX(@pat COLLATE LATIN1_GENERAL_BIN,@str)

RETURN(@str)

END

go


--创建表
create table tb
(id int,
Flag varchar(2),
CarTypeName nvarchar(15),
CarTypeMoney varchar(6),
StopTime Nvarchar(1)
)

--测试数据
insert into tb
select 1,'A' ,'三轮', '1.0', '次' union all
select 2,'B' ,'货的(皮卡)', '2.0', '次' union all
select 4, 'C', '拖拉机', '3.0', '次' union all
select 5, 'D', '箱式车', '5.0', '次' union all
select 6, 'E', '中卡车', '10.0', '次' union all
select 7, 'F', '大卡车', '15.0', '次' union all
select 8, 'G', '集装箱(后四轮)', '20.0', '次' union all
select 9 ,'H','大型集装箱(后八轮)', '30.0', '次' union all
select 10, 'I', '手拉车', '0.0', '次'

--注意第一个为半角' ' ,第二个问全角' '
select Id, left(Flag + replicate(' ', 5), 5) + left([dbo].[f_Convert](CarTypeName,1) + replicate(' ', 15), 15)
+ CarTypeMoney + '/' + StopTime
as CarType from tb

--结果
Id CarType
----------- ------------------------------
1 A 三轮             1.0/次
2 B 货的(皮卡)         2.0/次
4 C 拖拉机            3.0/次
5 D 箱式车            5.0/次
6 E 中卡车            10.0/次
7 F 大卡车            15.0/次
8 G 集装箱(后四轮)       20.0/次
9 H 大型集装箱(后八轮)     30.0/次
10 I 手拉车            0.0/次

(9 行受影响)





koumingjie 2011-11-10
  • 打赏
  • 举报
回复



--全角转半角
Create FUNCTION [dbo].[f_Convert](

@str NVARCHAR(4000), --要转换的字符串

@flag bit --转换标志,0转换成半角,1转换成全角

)RETURNS nvarchar(4000)

AS

BEGIN

DECLARE @pat nvarchar(8),@step int,@i int,@spc int

IF @flag=0

SELECT @pat=N'%[!-~]%',@step=-65248,

@str=REPLACE(@str,N' ',N' ')

ELSE

SELECT @pat=N'%[!-~]%',@step=65248,

@str=REPLACE(@str,N' ',N' ')

SET @i=PATINDEX(@pat COLLATE LATIN1_GENERAL_BIN,@str)

WHILE @i>0

SELECT @str=REPLACE(@str,

SUBSTRING(@str,@i,1),

NCHAR(UNICODE(SUBSTRING(@str,@i,1))+@step))

,@i=PATINDEX(@pat COLLATE LATIN1_GENERAL_BIN,@str)

RETURN(@str)

END

go

create table tb
(id int,
Flag varchar(2),
CarTypeName nvarchar(15),
CarTypeMoney varchar(6),
StopTime Nvarchar(1)
)


insert into tb
select 1,'A' ,'三轮', '1.0', '次' union all
select 2,'B' ,'货的(皮卡)', '2.0', '次' union all
select 4, 'C', '拖拉机', '3.0', '次' union all
select 5, 'D', '箱式车', '5.0', '次' union all
select 6, 'E', '中卡车', '10.0', '次' union all
select 7, 'F', '大卡车', '15.0', '次' union all
select 8, 'G', '集装箱(后四轮)', '20.0', '次' union all
select 9 ,'H','大型集装箱(后八轮)', '30.0', '次' union all
select 10, 'I', '手拉车', '0.0', '次'


select Id, left(Flag + replicate(CHAR(9), 5), 5) + left([dbo].[f_Convert](CarTypeName,1) + replicate(' ', 15), 15)
+ CarTypeMoney + '/' + StopTime
as CarType from tb

Id CarType
----------- ------------------------------
1 A 三轮             1.0/次
2 B 货的(皮卡)         2.0/次
4 C 拖拉机            3.0/次
5 D 箱式车            5.0/次
6 E 中卡车            10.0/次
7 F 大卡车            15.0/次
8 G 集装箱(后四轮)       20.0/次
9 H 大型集装箱(后八轮)     30.0/次
10 I 手拉车            0.0/次

(9 行受影响)



zwk_9 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bzcode 的回复:]
结果显示在表格里不就好了吗?
[/Quote]
我要把结果显示在c#的combobox里面,只能绑定一个字段的
--小F-- 2011-11-10
  • 打赏
  • 举报
回复
对齐成什么样子的?
大蛮 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bzcode 的回复:]
结果显示在表格里不就好了吗?
[/Quote]
94
koumingjie 2011-11-10
  • 打赏
  • 举报
回复
应该是半角‘(’,‘)’影响的
bzcode 2011-11-10
  • 打赏
  • 举报
回复
结果显示在表格里不就好了吗?
koumingjie 2011-11-10
  • 打赏
  • 举报
回复
select Id, left(Flag + replicate(CHAR(9), 5), 5) + left(CarTypeName + replicate(' ', 50), 30)
+ CarTypeMoney + '/' + StopTime
as CarType from tb

1,将CarTypeName字段中的值转换成全角
2、replicate中换成全角空格
Mr_Nice 2011-11-10
  • 打赏
  • 举报
回复

DECLARE @table TABLE(cartypemoney VARCHAR(10),stoptime VARCHAR(10))
INSERT INTO @table
SELECT '1.0','次'
UNION ALL
SELECT '15.0','次'
UNION ALL
SELECT '8.0','次'

SELECT REVERSE(CONVERT(VARCHAR(10),REVERSE(CarTypeMoney + '/' + StopTime)+SPACE(10)))
FROM @table

/*

(3 行受影响)

----------
1.0/次
15.0/次
8.0/次
*/


???
koumingjie 2011-11-10
  • 打赏
  • 举报
回复
将 ''换成char(9)试试
Mr_Nice 2011-11-10
  • 打赏
  • 举报
回复
怎么个对齐法?

1.0/次
15.0/次

??
koumingjie 2011-11-10
  • 打赏
  • 举报
回复
没明白什么意思?什么叫最后一列能对对齐

22,302

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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