我有一个类似下面的数据集,我想从中删除日期组件。一个挑战是日期可以采用不同的格式,如下所示。
现有输出
Event A 05-25-2015
Event B 25-05-2015
Event C April 2015
Event D 2016
所需输出
Event A
Event B
Event C
Event D
答案 0 :(得分:7)
让你入门的东西。根据您可能面临的格式数量,您可能希望将它们全部作为模式放入表中,加入该表,并使用LEN
计算STUFF
命令的值。
DECLARE @test TABLE (my_string VARCHAR(50) NOT NULL)
INSERT INTO @test (my_string)
VALUES
('Event A 05-25-2015'),
('Event B 25-05-2015'),
('Event C April 2015'),
('Event D 2016')
SELECT
CASE
WHEN PATINDEX('%[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]%', my_string) > 0
THEN STUFF(my_string, PATINDEX('%[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]%', my_string), 10, '')
WHEN PATINDEX('%April [0-9][0-9][0-9][0-9]%', my_string) > 0
THEN STUFF(my_string, PATINDEX('%April [0-9][0-9][0-9][0-9]%', my_string), 10, '')
WHEN PATINDEX('%[0-9][0-9][0-9][0-9]%', my_string) > 0
THEN STUFF(my_string, PATINDEX('%[0-9][0-9][0-9][0-9]%', my_string), 4, '')
ELSE my_string
END AS my_string
FROM
@test
我的猜测是,非常容易出错,如果某人有一个名为“Event 6421”的事件,可能会发现误报。
这也只处理您的示例数据中的格式。我想你可能需要处理更多,但这应该指向正确的方向。
答案 1 :(得分:0)
这里使用CROSS APPLY
的另一种方法应该处理任何格式的数据。
这将考虑您的数据中两个空格,并提取第二个空格之前的数据。
CREATE TABLE #strings
(
col VARCHAR(50)
)
INSERT INTO #strings
VALUES ('Event A 05-25-2015'),
('Event B 25-05-2015'),
('Event C April 2015'),
('Event D 2016'),
('Event 4736765 2016')
SELECT Extracted_string = LEFT(col, pos2 - 1)
FROM #strings
CROSS apply (VALUES (Charindex(' ', col)))a(pos1)
CROSS apply (VALUES(Charindex(' ', col, pos1 + 1)))b(pos2)
<强>结果:强>
Extracted_string
----------------
Event A
Event B
Event C
Event D
Event 4736765
答案 2 :(得分:-2)
您是否拥有更新数据集的控件?如果是这样,请更新数据集并分隔两列。如果没有,请使用子字符串来删除事件名称。