Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 提取不以特定单词结尾的值_Sql_Sql Server - Fatal编程技术网

Sql 提取不以特定单词结尾的值

Sql 提取不以特定单词结尾的值,sql,sql-server,Sql,Sql Server,我有一张有一些数据的表格。例如,它可以如下所示: 7 Gelb 8 Schwarz 9 Weiß my color 10 Grau 16 Gelb I 17 Gelb II 18 Gelb III 19 Gelb IV 27 Schwarz I 28 Schwarz II 29 Schwarz III 30 Schwarz IV 31 Schwarz V 32 Schwarz VI 39 Weiß my col

我有一张有一些数据的表格。例如,它可以如下所示:

7   Gelb    
8   Schwarz
9   Weiß my color
10  Grau
16  Gelb I  
17  Gelb II 
18  Gelb III    
19  Gelb IV 
27  Schwarz I   
28  Schwarz II  
29  Schwarz III 
30  Schwarz IV  
31  Schwarz V   
32  Schwarz VI  
39  Weiß my color III   
40  Weiß my color IV    
41  Weiß my color V 
42  Weiß my color VI    
DROP TABLE #Table1

CREATE TABLE #Table1
    ([ID] int, [name] varchar(17))
;

INSERT INTO #Table1
    ([ID], [name])
VALUES
    (7, 'Gelb'),
    (8, 'Schwarz'),
    (9, 'Weiß my color'),
    (10, 'Grau'),
    (16, 'Gelb I'),
    (17, 'Gelb II'),
    (18, 'Gelb III'),
    (19, 'Gelb IV'),
    (27, 'Schwarz I'),
    (28, 'Schwarz II'),
    (29, 'Schwarz III'),
    (30, 'Schwarz IV'),
    (31, 'Schwarz V'),
    (32, 'Schwarz VI'),
    (39, 'Weiß my color III'),
    (40, 'Weiß my color IV'),
    (41, 'Weiß my color V'),
    (42, 'Weiß my color VI')
;

--select name, patindex('%M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})', name) from #Table1
--select name, patindex('% [IVXLC]%', name) from #Table1

;with n as 
(select 1 as n
union all
select n.n+1 as n
from n where n < 100),
nr as
(select n, dbo.ToRomanNumerals(n) r
from n)
select name, nr.r, COALESCE(LEFT(name, PATINDEX('% ' + nr.r, name)), name) from #Table1 t
LEFT JOIN nr ON t.name LIKE '% ' + nr.r
正如你所看到的,在一些记录中,我们使用的是罗马数字

例如,有“Gelb”、“Weißmy color”和“Schwarz”,在罗马惯例中也有关于它们的记录。对一些人来说,比如“Grau”,没有重复的

因此,将有一些记录具有唯一的颜色名称,没有罗马数字,例如记录“Grau”,在表中,它可能包含或不包含一些带有罗马数字的记录

罗马数字的结尾总是这样:

我的目标只是得到唯一的名字。因此,出于示例,我只想提取:

7   Gelb    
8   Schwarz    
9   Weiß my color   
10  Grau  
我怎样才能做到这一点

我从这个开始,够了吗

Select Id, Name From MyTable Where Name Not Like = '%<space><anyromancharacter>'
从MyTable中选择Id,Name,其中Name Not Like='%'

我无法更改数据库的结构。

我希望这能解决您的问题。 在表中再添加一列,该列只包含名称的罗马数字,若并没有罗马数字,则保存空字符串

select distinct left(NAME,LEN(NAME)-CHARINDEX(RomanNumberColumn,REVERSE(NAME))) FROM TABLE

我会这么做的。首先,从创建ToRomanNumerals函数

现在用罗马数字创建数字表(我是从1..100创建的),然后使用左边(CHARINDEX)从名称中删除罗马数字,如下所示:

7   Gelb    
8   Schwarz
9   Weiß my color
10  Grau
16  Gelb I  
17  Gelb II 
18  Gelb III    
19  Gelb IV 
27  Schwarz I   
28  Schwarz II  
29  Schwarz III 
30  Schwarz IV  
31  Schwarz V   
32  Schwarz VI  
39  Weiß my color III   
40  Weiß my color IV    
41  Weiß my color V 
42  Weiß my color VI    
DROP TABLE #Table1

CREATE TABLE #Table1
    ([ID] int, [name] varchar(17))
;

INSERT INTO #Table1
    ([ID], [name])
VALUES
    (7, 'Gelb'),
    (8, 'Schwarz'),
    (9, 'Weiß my color'),
    (10, 'Grau'),
    (16, 'Gelb I'),
    (17, 'Gelb II'),
    (18, 'Gelb III'),
    (19, 'Gelb IV'),
    (27, 'Schwarz I'),
    (28, 'Schwarz II'),
    (29, 'Schwarz III'),
    (30, 'Schwarz IV'),
    (31, 'Schwarz V'),
    (32, 'Schwarz VI'),
    (39, 'Weiß my color III'),
    (40, 'Weiß my color IV'),
    (41, 'Weiß my color V'),
    (42, 'Weiß my color VI')
;

--select name, patindex('%M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})', name) from #Table1
--select name, patindex('% [IVXLC]%', name) from #Table1

;with n as 
(select 1 as n
union all
select n.n+1 as n
from n where n < 100),
nr as
(select n, dbo.ToRomanNumerals(n) r
from n)
select name, nr.r, COALESCE(LEFT(name, PATINDEX('% ' + nr.r, name)), name) from #Table1 t
LEFT JOIN nr ON t.name LIKE '% ' + nr.r

更新

select * from dbo.test
Where value not Like '%[MDILXV]_' Collate SQL_Latin1_General_CP1_CS_AS
步骤1:

select * from dbo.test

    id  value
    1   Gelb
    2   Gelb I
    3   Weiß my color III
    4   Weiß my color
当我给

   select * from dbo.test
    Where value not Like '%[IXLV]' Collate SQL_Latin1_General_CP1_CS_AS

id  value
1   Gelb
4   Weiß my color
这应该是一项工作:

select distinct ID, name from YourTable
where right (name,charindex(' ',REVERSE(name))) not like '%[IVXLCDM]%' COLLATE SQL_Latin1_General_CP1_CS_AS

Where
仅检查
NAME
列中的最后一个单词,如果它包含
X V I L
字符。

cte
替换为表名,与列相同。我使用
id
表示数字代码,使用
name
表示名称

SELECT DISTINCT c.id,
                t.name 
FROM (
    SELECT  c1.name,
            DENSE_RANK() OVER (PARTITION BY c2.name ORDER BY c1.name) as DR
    FROM cte c1
    LEFT JOIN cte c2 
        ON c2.name LIKE c1.name + '%' 
) as t
INNER JOIN cte c
    ON c.name = t.name 
WHERE t.DR = 1
输出:

id          name
----------- -----------------
7           Gelb
8           Schwarz
9           Wei? my color
10          Grau

(4 row(s) affected)
以下是我的解决方案:

首先,生成一个罗马数字列表,直到指定的限制。然后,从表格中提取最后一个单词,并检查它是否存在于罗马数字列表中:

参考:



我认为您应该首先找到空格的最后一个索引。然后使用
SUBSTRING
函数获取从索引0到空格最后一个索引的子字符串(如果存在,则使用整个字符串)。最后但并非最不重要的一点是,使用
选择DISTINCT
获取唯一的名称。例如,要查找字符的最后一个索引,您可以在此处查看:这可能会有所帮助:
SELECT*FROM MyTable,其中名称与“%[I II IV V VI IX X XI]”不同。
SELECT。。。从名称不象“[^A-Z]%”的MyTable中,将SQL\u Latin1\u General\u CP1\u CS\u整理为尝试一些regexAre是否绝对没有类似罗马数字的名称?例如,人们可以想象,在某些语言中,
liv
可能是一个实际的单词。@回溯工作很好,但它也会排除“我的颜色”。如何解决此问题?很遗憾,此查询将返回
Weißmy
。好的,但我想我们无法在您的要求中清楚地检查罗马数字,因为有些名称以“I”结尾,在这种情况下,I不是罗马数字,但它看起来像罗马数字,也像名称。是的,因为这将是错误的,而且我还添加了独特的,但仍然看到许多Gelb的,Schwarz的。。。从tbVariation_属性中选择DISTINCT left(NAME,LEN(NAME)-CHARINDEX(“”,REVERSE(NAME)),作为NAME,Id,FK_Variation_Id,因此我们还有两个错误需要解决。我想我们不必检查罗马尼亚数字,我们只需要寻找最后一个空间,如果在那个空间之后有什么东西,我们必须排除它record@Backtrack答案是可行的,但麻生太郎排除了“我的颜色”必须对我有什么工作,我不能改变数据库结构。是否真的没有办法基于此表结构进行提取?非常感谢您的帮助。我没有建议更改数据库结构,但我也无法生成函数。。。我必须在一个查询中使用它,而不使用函数、新表等。。如果是这样,我会这样做;/这就是sh**customer dbIs,仅仅查找最后一个空格字符是否就不那么简单了,如果之后的某个字符排除了此记录?函数可以像Felix Pamittan那样轻松地转换为交叉应用查询。除此之外,您还可以在tempdb数据库中创建一个函数,然后将其删除。查找最后一个空格可能不起作用,因为您需要确保最后一个空格后面的所有内容都是罗马数字。在您的查询之后,不会出现“Weißmy color”(请注意,如果您使用此查询“Weißmy color”,可能会出现更高的罗马尼亚数字)应该出现。对于更高的罗马尼亚数字,您可以在“WHERE”子句中添加“%C%”、“%D%”和“%M%”。@JimmyJimm,现在检查它似乎可以工作了,但请注意,罗马尼亚数字甚至可以达到4000,所以不仅可以达到X,还可以排除最后一个空格后的任何数字吗?例如,我可以在结尾处添加MMMDLXIVok很好,您可以只使用exp吗放在这里:MDILXV,为什么在末尾?为什么要将SQL\u Latin1\u General\u CP1\u CS\u整理为?Hi@JimmyJimm,uu的原因是匹配字符串末尾的空格。在您提供的数据集中,当我插入SQL时,我在末尾发现了空格,我还将匹配字符串末尾的任何字符string@JimmyJimm考虑一下投票如果看起来没问题,我就接受