Sql server 在SQL server中使用SQL查询获取不带扩展名的文件名

Sql server 在SQL server中使用SQL查询获取不带扩展名的文件名,sql-server,tsql,Sql Server,Tsql,从SQL表中的列中获取扩展名为out的文件名时出现问题,如下所示 在dbo.emp表中,列名为[image],值为: temp.jpg test1.jpg test1.jpeg sample.jpg sample1.gif 现在我只想得到temp,test1,sample,sample1,不带扩展名.jpg,.jpeg,等等 DECLARE @x VARCHAR(32); SET @x = 'temp.jpg'; SELECT SUBSTRING(@x, 1, CHARINDEX('.', @

从SQL表中的列中获取扩展名为out的文件名时出现问题,如下所示

dbo.emp
表中,列名为
[image]
,值为:

temp.jpg
test1.jpg
test1.jpeg
sample.jpg
sample1.gif
现在我只想得到
temp
test1
sample
sample1
,不带扩展名
.jpg
.jpeg
,等等

DECLARE @x VARCHAR(32);
SET @x = 'temp.jpg';
SELECT SUBSTRING(@x, 1, CHARINDEX('.', @x)-1);
-- or SELECT LEFT(@x, CHARINDEX('.', @x)-1);
结果:

temp
但是,这并没有指定在未找到
时要执行的操作。如果要处理该问题并在未找到
时返回整个字符串:

DECLARE @x TABLE([image] VARCHAR(32));
INSERT @x SELECT 'temp.jpg' UNION ALL SELECT 'sample1.gif' UNION ALL SELECT 'foo';
SELECT SUBSTRING([image], 1, COALESCE(NULLIF(CHARINDEX('.', [image]),0)-1, 32)) FROM @x;
结果:

temp
x
foo
另一种方式:

left(fn, len(fn) - charindex('.', reverse(fn)))
例如

为了


为什么从索引1开始,然后减去?另外,如果没有找到“.”,这会引发一个异常,这在查询中并不理想…@Dave在您的评论之前,我已经为no
添加了处理。另外,从索引1开始只是一种习惯,因为第一个字符=字符1,这映射到LEFT如何处理它。+1,因为您的答案涵盖了所有可能的情况:文件名中没有“.”或多个“.”
left(fn, len(fn) - charindex('.', reverse(fn)))
;with T (fn) as (
    select ''            union
    select 'aaa'         union
    select 'aaa.bbb'     union
    select 'aaa.bbb.ccc'
)
select left(fn, len(fn) - charindex('.', reverse(fn))) from T
(No column name)

aaa
aaa
aaa.bbb