Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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,如何列出所有姓氏相同的乐队成员的姓名 该列具有如下值 band_NAME ------------------- Carla Thomas Stephen E. Rice Cynthia P. Tree Richard Anthony Paul Ann Frances Smith Lorace Black Timothy Adam Paul SELECT [LastName], COUNT(*) FROM (

如何列出所有姓氏相同的乐队成员的姓名

该列具有如下值

band_NAME
-------------------
Carla Thomas
Stephen E. Rice
Cynthia P. Tree
Richard Anthony Paul
Ann Frances Smith
Lorace Black
Timothy Adam Paul
SELECT
            [LastName],
            COUNT(*)
    FROM
        (
            SELECT
                     [band_NAME],
                     CASE WHEN CHARINDEX(' ', [band_NAME]) > 0
                        THEN
                            RIGHT([band_NAME], CHARINDEX(' ', REVERSE([band_NAME])))
                        ELSE
                            [band_NAME]
                   END [LastName]
                FROM
                   [TABLE]
        ) [TABLEWithLastName]
    GROUP BY
            [LastName];
我知道我们必须使用
instr
substr
。我只是不知道我们将如何确定位置

我知道基本格式是这样的

SELECT band_NAME 
FROM TABLE 
where substr(band_name, ?, instr( ) IN 
    (select substr(band_name, ?, instr( )-1)  
     from table 
     group by SUBSTR(band_NAME , ?, INSTR( )-1 ) 
     HAVING COUNT(* ) > 1 );
但是问号和
指令中的内容是什么


非常感谢您在这方面的帮助

我假设您的名字和姓氏之间的分隔符是一个空格。字符串中的更多空格是姓氏的一部分。因此,您可能希望搜索第一个空格字符

返回第一次出现的子字符串的位置

然后,使用返回从给定位置开始的子字符串(按instr函数馈送)

试试这个:

SELECT t1.band_NAME
FROM TABLE t1 LEFT JOIN TABLE t2
 ON SUBSTRING_INDEX(t1.band_name, ' ', - 1) = SUBSTRING_INDEX(t2.band_name, ' ', - 1)
WHERE t1.band_name <> t2.band_name
SQL Server

SELECT band_NAME FROM TABLE
Where
 SUBSTRING(band_NAME, CHARINDEX(' ', band_NAME) + 1, LEN(band_NAME)) AS [Last Name]
IN
 (Select SUBSTRING(band_NAME, CHARINDEX(' ', band_NAME) + 1, LEN(band_NAME)) AS [Last Name]
 From TABLE Group by [Last Name] -- or SUBSTRING(band_NAME, CHARINDEX(' ', band_NAME) + 1, LEN(band_NAME)) AS [Last Name]
 having Count(*) > 1
 )
)
此外,我认为您可以从中获得一些好处

试试这个

 with cte as
(
select band_name, ROW_NUMBER() over(partition by SUBSTRING(band_name,CHARINDEX(' ',band_name),LEN(band_name))  order by band_name) as cnt,
        SUBSTRING(band_name,CHARINDEX(' ',band_name),LEN(band_name)) as lastname
from your_table
)
select band_name 
from cte
where lastname in (select lastname from cte where cnt > 1)
好,

最好的解决方案是更改模式并将姓氏存储在单独的列中

同时你可以得到这样的姓氏

SELECT
            [band_NAME],
            CASE WHEN CHARINDEX(' ', [band_NAME]) > 0
                THEN
                    RIGHT([band_NAME], CHARINDEX(' ', REVERSE([band_NAME])))
                ELSE
                    [band_NAME]
            END [LastName]
    FROM
            [TABLE]
你可以这样把他们分组

band_NAME
-------------------
Carla Thomas
Stephen E. Rice
Cynthia P. Tree
Richard Anthony Paul
Ann Frances Smith
Lorace Black
Timothy Adam Paul
SELECT
            [LastName],
            COUNT(*)
    FROM
        (
            SELECT
                     [band_NAME],
                     CASE WHEN CHARINDEX(' ', [band_NAME]) > 0
                        THEN
                            RIGHT([band_NAME], CHARINDEX(' ', REVERSE([band_NAME])))
                        ELSE
                            [band_NAME]
                   END [LastName]
                FROM
                   [TABLE]
        ) [TABLEWithLastName]
    GROUP BY
            [LastName];

这是怎么回事?在“Jerry Lee Lewis”一词中,名字是“Jerry Lee”,姓氏是“Lewis”,因此您可以先拆分,姓氏在最后一个空格处。在“加布里埃尔·加西亚·马尔克斯”中,名字是“加布里埃尔”,姓氏是“加西亚·马尔克斯”,即你在第一个空格处分开。也有像“胡安·路易斯·加西亚·佩拉莱斯”这样的名字,其中第一个和姓氏之间既不是第一个空格,也不是最后一个空格。然后想想中国人的名字,姓氏在哪里。是的,没错,我不知道怎么把它分开。上面列出的一些名字有一个中间的首字母,这样可以在句号后分开,但对于其他有三个名字的人,我不知道我会怎么做。只需要找出一种方法来找到匹配的姓氏并显示它们。我要说的是,你不能仅仅从全名中得出什么是名字,什么是姓氏。你必须有更多的信息。可能是一本关于姓氏和姓氏的词典。(即便如此,“保罗”也可以是名字和姓氏)。也许你可以妥协一下。但是,由你自己来定义你应该接受的规则。嗯,有更多的栏目相关,但没有一个确定名字的名字……我在发布这个问题之前尝试了这个尝试,但是它不恰当地工作:(鲍勃:这不告诉我任何事。“不幸的是,它不能正常工作”的意思是?对不起,我是一个完全的初学者。当我尝试上面的代码时,它说“无效”“.@Bob,这不允许我复制任何内容。请在您的问题中附上所需的结果……还有,您尝试过的完整代码和错误。我尝试过了,效果很好,您能确保括号正确闭合吗?您可以用您的真实表名在两个位置更改
?@Bob和您的精确查询“意外的sql命令结束。”如果这有什么不同,我将使用sql developer…?它无法识别“子字符串索引”,所以在添加另一个括号后,我将其替换为substr。然后它说“bn”是“无效运算符--不存在”“.哦,你用
mysql
@Bob@Bob抱歉,我没有
sql server
,因此我尝试按预期编写,尝试编辑后的答案,并用更新后的代码告诉我它表示关系运算符无效。我尝试了两种方法。sql developer无法识别“len”所以我把它改成了长度。也把substring改成了substr,charindex改成了instr。我不明白为什么它不起作用。。。