'.'如果它不包含數字,我想在最后一個點之后洗掉一個子字串。
示例資料:
ID Name
1 example.jpg
2 exampleexample01.01.2014
3 example
4 example1.pdf
5 example13.pdf
6 this. is an. example
7 this.is.a.pdf
期望的結果:
ID Name
1 example
2 exampleexample01.01.2014
3 example
4 example1
5 example13
6 this. is an. example
7 this.is.a
我的解決方案在點后洗掉每個子字串:
SELECT LEFT([Name], CHARINDEX('.', [Name] '.') - 1 ) AS Name
FROM Table
編輯:我更新了示例以顯示一個字串中可能有多個點。
uj5u.com熱心網友回復:
這似乎可以滿足您的要求;獲取最后一個點的位置,檢查這些字符是否包含數字以及它們是否回傳Name。如果不是,則從字串末尾開始對這些字符進行字串化:
SELECT *,
CASE WHEN RIGHT(V.[Name],CI.LastDot) LIKE '%[0-9]%' THEN V.Name ELSE LEFT(V.[Name], LEN(V.Name) - CI.LastDot) END
FROM (VALUES(1,'example.jpg'),
(2,'exampleexample01.01.2014'),
(3,'example'),
(4,'example1.pdf'),
(5,'example13.pdf'))V(ID,Name)
CROSS APPLY(VALUES(CHARINDEX('.',REVERSE(V.Name))))CI(LastDot);
uj5u.com熱心網友回復:
您可以使用此查詢。基本上,您可以在點之前和之后找到字串,并根據您的要求應用一個簡單的案例。
WITH before_after AS (
SELECT Name,
LEFT([Name], CHARINDEX('.', [Name] '.') - 1 ) AS before_dot,
SUBSTRING([Name], CHARINDEX('.', [Name]) 1, LEN([Name]) - CHARINDEX('.', [Name]) 1) AS after_dot
FROM table
)
SELECT CASE
WHEN after_dot LIKE '%[0-9]%' THEN before_dot
ELSE Name
END Result
FROM before_after;
uj5u.com熱心網友回復:
SELECT case when ISNUMERIC(RIGHT([Name], CHARINDEX('.', [Name] '.') - 1 )) =1 then [Name]
else LEFT([Name], CHARINDEX('.', [Name] '.') - 1 ) end as [Name] FROM Table
uj5u.com熱心網友回復:
試試這個,但請注意 PARSENAME 只能用于小于或等于 3 個點:
SELECT ID, CASE WHEN PARSENAME(REVERSE([Name]),1) LIKE '%[0-9]%' THEN [Name]
ELSE LEFT([Name], LEN([Name]) - CHARINDEX('.', REVERSE([Name]))) END AS [Name],
FROM [Table]
另一種方法是:
SELECT ID, CASE WHEN RIGHT([Name], CHARINDEX('.', REVERSE([Name]))) LIKE '%.[0-9]%' THEN [Name]
ELSE LEFT([Name], LEN([Name]) - CHARINDEX('.', REVERSE([Name]))) END AS [Name]
FROM [Table]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/439476.html
