根据字段的开头选择记录?

Posted

技术标签:

【中文标题】根据字段的开头选择记录?【英文标题】:Select records based on what a field begins with? 【发布时间】:2011-05-31 19:24:21 【问题描述】:

我有一个数据库,其中的表具有标识符 c1、c2、c3..etc..

与其编写一个包含一堆ORs 的查询,不如我如何修改下面的查询,以捕获所有以某个字母开头的记录?

SELECT 
    Person.spineinjuryAdmit, 
    tblComorbidity.comorbidityexplanation,
    Count(tblComorbidity.comorbidityexplanation) AS CountOfcomorbidityexplanation

FROM tblKentuckyCounties 
INNER JOIN (tblComorbidity 
            INNER JOIN (Person 
                        INNER JOIN tblComorbidityPerson 
                            ON Person.PersonID = tblComorbidityPerson.personID) 
                ON tblComorbidity.ID = tblComorbidityPerson.comorbidityFK) 
    ON tblKentuckyCounties.ID = Person.County
GROUP BY    Person.spineinjuryAdmit, 
            tblComorbidity.comorbidityexplanation
HAVING (((Person.spineinjuryAdmit)="c1" Or 
         (Person.spineinjuryAdmit)="c2" Or 
         (Person.spineinjuryAdmit)="c3"));

【问题讨论】:

我不确定你是否喜欢这样做,但我喜欢这样构建我的连接语句:FROM tblKentuckyCounties kJOIN Person p ON p.County = k.IDJOIN tblComorbidityPerson cp ON cp.personID = p.PersonIDJOIN tblComorbidity c ON c.ID = cp.comorbidityFK 【参考方案1】:

您是否尝试过使用LIKE?举个例子:

SELECT * FROM patients WHERE lastName LIKE 'm%';

这将返回patients.lastName 以“m”开头的记录。 '%' 字符可能是 '*' 用于访问,我不记得了。在某些数据库中,您还可以使用“_”来匹配单个字符(或者您添加的多个下划线)。

【讨论】:

我尝试使用通配符 % 但一开始我做错了,所以我来寻求帮助。 传统的 Access (Jet/ACE) 通配符是 * 和 ?,使用默认的“ANSI 89 SQL 模式”(Access 专有)。 % 和 _ 是 ANSI 92 SQL,您可以在 ANSI 92 SQL 模式下运行 Access,但我不推荐它(它在以 ANSI 89 模式构建的应用程序中破坏了很多东西)。或者,如果您想使用 ANSI 92 通配符,您可以使用专有的 ALIKE 运算符,或者使用 OLEDB/ADO 运行 SQL,默认情况下使用 ANSI 92 模式(DAO 使用 ANSI 89)。【参考方案2】:
    SELECT Person.spineinjuryAdmit, tblComorbidity.comorbidityexplanation, Count(tblComorbidity.comorbidityexplanation) AS CountOfcomorbidityexplanation
FROM tblKentuckyCounties INNER JOIN (tblComorbidity INNER JOIN (Person INNER JOIN tblComorbidityPerson ON Person.PersonID = tblComorbidityPerson.personID) ON tblComorbidity.ID = tblComorbidityPerson.comorbidityFK) ON tblKentuckyCounties.ID = Person.County
GROUP BY Person.spineinjuryAdmit, tblComorbidity.comorbidityexplanation
HAVING (Person.spineinjuryAdmit LIKE "c*");

【讨论】:

会在我被允许的情况下尽快接受。我想问 SO 会比谷歌搜索更快。谢谢:)【参考方案3】:

在执行 GROUP BY 之前,您可以使用 WHERE 子句排除不需要的行。

SELECT 
    p.spineinjuryAdmit, 
    c.comorbidityexplanation,
    Count(c.comorbidityexplanation) AS CountOfcomorbidityexplanation
FROM tblKentuckyCounties AS k
INNER JOIN (tblComorbidity AS c
            INNER JOIN (Person AS p
                        INNER JOIN tblComorbidityPerson AS cp
                            ON p.PersonID = cp.personID) 
                ON c.ID = cp.comorbidityFK) 
    ON k.ID = p.County
WHERE p.spineinjuryAdmit ALike "c%"
GROUP BY    p.spineinjuryAdmit, 
            c.comorbidityexplanation

如果您的查询是在 SQL-89 模式下执行的,则可以将其用作 WHERE 子句。

WHERE p.spineinjuryAdmit Like "c*"

在 SQL-92 模式下,您需要标准的 ANSI 通配符。

WHERE p.spineinjuryAdmit Like "c%"

我使用 Alike 告诉数据库引擎期待 ANSI 通配符。

DAO 使用 SQL-89 模式...除非您已将数据库选项设置为使用 SQL-92 模式(“SQL Server 兼容语法)。

如果您使用 ADO 运行查询,它将始终使用 SQL-92 模式。

【讨论】:

【参考方案4】:

您可以使用正则表达式查询以多个字符开头的所有行。

SELECT * FROM table WHERE column REGEXP '^[ c1, c2, c3]';

此查询将返回列以“c1”或“c2”或“c3”开头的所有行。

【讨论】:

【参考方案5】:

你有两个选择:

    使用LIKE 运算符

    使用IN 运算符

例如:

Person.spineinjuryAdmit LIKE "c*"

Person.spineinjuryAdmit IN ("c1", "c2", "c3")

有关 LIKE 的详细信息,请参阅http://office.microsoft.com/en-us/access-help/like-operator-HP001032253.aspx。

公平警告:Access 中的 LIKE 通配符是 *?,而不是 %_(大多数其他 SQL 版本都是这种情况)。

【讨论】:

【参考方案6】:

您可以修改它以在WHERE 子句中包含过滤器列表。以下将查找姓氏以Smith 开头的患者。 (即SmithSmithson等),以及Admitc开头的那些。

....
WHERE spineinjuryAdmit LIKE 'c*'
AND   Patient.FirstName LIKE 'Smith*'
GROUP BY    Person.spineinjuryAdmit,             
            tblComorbidity.comorbidityexplanation;

【讨论】:

以上是关于根据字段的开头选择记录?的主要内容,如果未能解决你的问题,请参考以下文章

SQL:根据最近的日期选择一个字段中的值是唯一的记录

选择Statement以根据在Textbox中输入的ID从两个表中选择记录

如何根据在表单上的组合框控件中输入的内容从查询中选择所有记录

对相关记录进行分组,但仅从第一条记录中选择某些字段

选择以特定模式开头的字段:Spark XML Parsing

MySQL,根据 JSON 数组中的值选择记录