Выбор записей на основе того, с чего начинается поле?

#sql #ms-access #ms-access-2007

#sql #ms-access #ms-access-2007

Вопрос:

У меня есть база данных с таблицей, которая имеет идентификаторы c1, c2, c3 .. и т.д..

Вместо написания запроса, в котором есть множество OR s, как я могу изменить приведенный ниже запрос чем-то, что будет перехватывать все записи, начинающиеся с определенной буквы?

 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"));
  

Комментарии:

1.Я не уверен, предпочитаете ли вы делать это таким образом, но мне нравится создавать свои операторы join следующим образом: FROM tblKentuckyCounties k JOIN Person p ON p.County = k.ID JOIN tblComorbidityPerson cp ON cp.personID = p.PersonID JOIN tblComorbidity c ON c.ID = cp.comorbidityFK

Ответ №1:

Вы пробовали использовать LIKE ? В качестве примера:

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

Это вернет записи, которые patients.lastName начинаются с ‘m’. Символом ‘%’ может быть ‘*’ для access, я не помню. В некоторых базах данных вы также можете использовать ‘_’, который будет соответствовать одному символу (или сколько бы подчеркиваний вы ни добавили).

Комментарии:

1. я пытался использовать подстановочный знак%, но изначально сделал это неправильно, поэтому обратился к SO за некоторой помощью.

2. Традиционными подстановочными знаками Access (Jet / ACE) являются * и ?, использующий «Режим SQL ANSI 89 по умолчанию» (который является собственностью Access). % и _ — это ANSI 92 SQL, и вы можете запускать Access в режиме ANSI 92 SQL, но я бы не рекомендовал этого (это нарушает многие функции в приложении, созданном в режиме ANSI 89). В качестве альтернативы, если вы хотите использовать подстановочные знаки ANSI 92, вы можете использовать собственный оператор ALIKE или запустить свой SQL с OLEDB / ADO, который по умолчанию использует режим 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*");
  

Комментарии:

1. будет принято, как только мне будет разрешено. я подумал, что задать SO будет быстрее, чем искать в Google. спасибо 🙂

Ответ №3:

Вы можете использовать предложение 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.

Режим SQL-89 используется DAO … если только вы не настроили параметр базы данных на использование режима SQL-92 («Синтаксис, совместимый с SQL Server»).

Если вы выполняете запрос с помощью ADO, он всегда будет использовать режим SQL-92.

Ответ №4:

Вы можете использовать regexp для запроса всех строк, которые начинаются с нескольких символов.

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

Этот запрос вернет все строки, где столбец начинается с ‘c1’, ‘c2’ или ‘c3’.

Ответ №5:

У вас есть два варианта:

  1. Используйте оператор LIKE

  2. Используйте оператор IN

Например:

 Person.spineinjuryAdmit LIKE "c*"

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

Смотрите http://office.microsoft.com/en-us/access-help/like-operator-HP001032253.aspx подробнее о LIKE.

Справедливое предупреждение: Подстановочными знаками LIKE в Access являются * и ? вместо % и _ (как и в случае с большинством других версий SQL).

Ответ №6:

Вы могли бы изменить это, чтобы включить список фильтров в WHERE предложение. Ниже будут найдены пациенты, фамилия которых начинается с Smith . (т.е. Smith и Smithson и т.д.), и те, у кого Admit начинается с c .

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