1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

Вопросы по MSSQL

Тема в разделе "Программирование", создана пользователем m4a1, 27.07.06.

  1. m4a1

    m4a1 Участник

    249
    0
    - Как сделать выборку некоторой части записей из таблицы? Есть ли в MSSQL нормальный аналог MySQLевского LIMITа? В инете нашел только кривые приемы типа вложенного SELECTа и вывода указанного в процентах количества записей. В данный момент для выбора записей с 50 по 100 из таблицы использую:

    SELECT TOP 50 * FROM (SELECT TOP (50 + 100) FROM `org` ORDER BY `title` ASC) ORDER BY `title` DESC

    Результат - записи с 50 по 100 в обратном порядке (порядок не важен собственно). Но это по моим представлениям жутко криво и 2 ORDER BYя вовсе не повышают производительность.

    - Как организовать нормальный pattern matching в MSSQL? Задача: есть поле `phone` в котором телефоны могут быть записаны как минимум 3 способами "123456", "123-456", "12-34-56". Как мне в выборке получить все 3 варианта написания, используя в запросе только первый вариант? Я сейчас тупо формирую запрос перебором вариантов написания:

    SELECT * FROM `org` WHERE `phone` = "123456" OR `phone` = "123-456" OR `phone` = "12-34-56"

    Это частный случай, так как телефон может записан и так: "1-23456". Вариант (SELECT * FROM `org` WHERE `phone` LIKE "12*34*56") не подходит, так как этому условию может удовлетворять "127689 553465 673256". Как я понял функция Replace не может быть использована в этой ситуации, то есть я не могу написать (SELECT * FROM `org` WHERE "123456" = Replace(`phone`, "-", "")). Как же быть? я наверняка не знаю простого механизма.

    Так как я даже не знаю с MSSQL ли я имею дело (хотя судя по геморрою уверен что да), то опишу ситуацию: программа написана с использованием C++ & MFC. К БД доступ организован через CDaoDatabase и CDaoRecordset, данные хранятся в *.mdb файле.

    Помогите пожалуйста, так как мне либо очень невезет с поиском решения, либо проблема действительно неразрешима.
     
  2. Пересмешник

    Пересмешник Участник

    1.835
    0
    В общем-то, mdb - это Access.
    И, навскидку: почему телефон не хранится в нормализованном виде, без дефисов? Или так: при сравнении предварительно уберите дефисы и сравнивайте нормализованную форму.
     
  3. Mix

    Mix Активный участник

    7.766
    0
    Правильная мысль.
    Неправильная мысль.
    А смысл?
     
  4. jek

    jek Активный участник

    5.733
    0
    Именно.
    Даже отвечать не буду. Учить SQL. SQL это декларативный язык.
    PS Запрос в вопросе написан неграмотно.
     
  5. m4a1

    m4a1 Участник

    249
    0
    ну вот так получилось. поле телефон - это просто varchar(255), куда вводятся телефоны через запятую. я понимаю что это неправильно, но мне нужно решение в рамках этой структуры.


    Я так и пытался сделать. SELECT * FROM `org` WHERE "123456" = Replace(`phone`, "-", ""). нельзя так в MSSQL


    Хочется получать одним запросом все нужные записи, чтобы потом курсором не прыгать никуда.


    Банально. Могли бы не утруждать себя ответом.
     
  6. sandy

    sandy Новичок

    3
    0
    Попробу использовать курсоры (cursors)
     
  7. m4a1

    m4a1 Участник

    249
    0
    ...
     
  8. AlTk

    AlTk Читатель

    10.699
    0
    1. "выборка некоторой части" организуется (в MS SQL) с помощью временной таблицы, но опять, "а смысл"?
    2. для "нормального pattern matching" сделайте нормальную схему БД.

    ПС. в школу.
    jek,
    "... учить SQL ... " и теорию РСУБД.
     
  9. m4a1

    m4a1 Участник

    249
    0
    ладно, ладно :) пойду под нары залезу.

    тем не менее спасибо, я уже понял что на MSSQL не получится так же удобно как на MySQL выразить свой "вопрос" к базе данных.
     
  10. The Last Winged

    The Last Winged Активный участник

    11.863
    48
    Кстати да, интересует этот вопрос. Нашел в журнале только подобный костыль(через подзапрос с DESC).
    Для чего это надо?
    Например разбить вывод записей по страницам на сайте?