Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2013, 22:22   #1
AvRob
Пользователь
 
Регистрация: 18.12.2011
Сообщений: 23
По умолчанию Delphi-BDE-LocalSQL - SQL запрос-найти конкретный номер

В Delphi имеется DBF таблица table1 с символьным полем NUM, где хранятся номера. номера могут содержать и буквы.

NUM
1. Р-25
2. 125-Н
3. 3257
4. П-25/12
5. 25
6. 257

Как с помощью SQL запроса найти строки имеющие в поле NUM число 25.

Результат должен быть
NUM
1. Р-25
4. П-25/12
5. 25

В MSSQL этот запрос я составил следующим образом -
Код:
SELECT *
FROM table1
where
(num LIKE N'%[^0-9]25[^0-9]%')
or(num LIKE N'%[^0-9]25')
or(num LIKE N'25[^0-9]%')
or(num LIKE N'25')
В Local SQL BDE это не работает но и не выдает ошибку.

Последний раз редактировалось Stilet; 14.06.2013 в 10:18.
AvRob вне форума Ответить с цитированием
Старый 14.06.2013, 10:30   #2
astecenko
Homo Interneticus
Форумчанин
 
Аватар для astecenko
 
Регистрация: 04.03.2011
Сообщений: 611
По умолчанию

Рекомендую ознакомится с справкой по Local SQL (по умолчанию c:\Program Files\Common Files\Borland Shared\BDE\LOCALSQL.HLP).
В частности статья оттуда:
Цитата:
LIKE predicate

Indicates the similarity of one value as compared to another.

value [NOT] LIKE [substitution_char] comparison_value [substitution_char] [ESCAPE escape_char]

Description

Use the LIKE comparison predicate to filter a table based on the similarity of a column value to a comparison value. Use of substitution characters allows the comparison to be based on the whole column value or just a portion.

SELECT *
FROM Customer
WHERE (Company LIKE "Adventure Undersea")

The wildcard substitution character ("%") may be used in the comparison to represent an unknown number of characters. LIKE returns a TRUE when the portion of the column value matches that portion of the comparison value not corresponding to the position of the wildcard character. The wildcard character can appear at the beginning, middle, or end of the comparison value (or multiple combinations of these positions). For example, the statement below retrieves rows where the column value begins with "A" and is followed by any number of any characters. Matching values could include "Action Club" and "Adventure Undersea", but not "Blue Sports".

SELECT *
FROM Customer
WHERE (Company LIKE "A%")

The single-character substitution character ("_") may be used in the comparison to represent a single character. LIKE returns a TRUE when the portion of the column value matches that portion of the comparison value not corresponding to the position of the single-character substitution character. The single-character substitution character can appear at the beginning, middle, or end of the comparison value (or multiple combinations of these positions). Use one single-character substitution character for each character to be wild in the filter pattern For example, the statement below retrieves rows where the column value begins with "b" ends with "n", with one character of any value between. Matching values could include "bin" and "ban", but not "barn".

SELECT Words
FROM Dictionary
WHERE (Words LIKE "b_n")

Use NOT to return the converse of a LIKE comparison.

Use ESCAPE when the wildcard character "%" or "_" appear as data in the column. The ESCAPE keyword designates an escape character. In the comparison value for the LIKE predicate, the character that follows the escape character is treated as a data character and not a wildcard character. Other wildcard characters in the comparison value are unaffected.

In the example below, the "^" character is designated as the escape character. In the comparison value for the LIKE predicate ("%10^%%"), the "%" that immediately follows the escape character is treated as data in the PercentValue. This allows filtering based on the string "10%".

SELECT *
FROM Sales
WHERE (PercentValue LIKE "%10^%%" ESCAPE "^")

LIKE can be used only with CHAR or compatible data types. If one value is of an incompatible data type, convert that value with the CAST function to a compatible data type. The comparison performed by the LIKE predicate is case-sensitive.
То есть применительно к Вашей задаче запрос будет
Код:
SELECT *
FROM table1
where (num LIKE "%25%")

Последний раз редактировалось astecenko; 14.06.2013 в 10:33.
astecenko вне форума Ответить с цитированием
Старый 14.06.2013, 10:46   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от astecenko Посмотреть сообщение
То есть применительно к Вашей задаче запрос будет
Код:
SELECT *
FROM table1
where (num LIKE "%25%")
это вряд ли устроит автора топика.
Его интересует число 25, а не все записи, где есть 25 внутри числа.

например, в его примере, не выбирается
строчка 3:
3. 3257

именно по этой причине!

p.s. как распарсить отдельное число - не знаю
думаю, что не очень эффективный и достаточно кривой, НО - РАБОЧИЙ алгоритм будет такой:
выбрать все записи, где есть 25 внутри (это запрос с like '%25%' предложенный astecenko
Потом на клиенте либо отфильтровать нужные записи, проверяя каждую собственной функцией, либо отобрать через ту же самую собственную функцию нужные записи в отдельный датасет/массив/коллекцию и далее работать уже с отобранными данными...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.06.2013, 11:41   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно извратиться (ИМХО) в таком духе
Код:
SELECT * 
  FROM table1
  WHERE num LIKE '25' OR
        (num LIKE '%_25' AND NOT SUBSTRING(num,LEN(num)-2,1) BETWEEN '0' AND '9') OR
        (num LIKE '25_%' AND NOT SUBSTRING(num,3,1) BETWEEN '0' AND '9') OR
        (num LIKE '%_25_%' AND NOT SUBSTRING(num,CHARINDEX('25',num)-1,1) BETWEEN '0' AND '9' AND 
                               NOT SUBSTRING(num,CHARINDEX('25',num)+2,1) BETWEEN '0' AND '9')
Чревато тем, что в последнем LIKE CHARINDEX ищет только первое вхождение '25', а их может быть теоретически несколько. 2-й и 3-ий LIKE тоже игнорят другие вхождения '25'. Ну и само собой индексы не используются. Посмотреть еще нужно замену SUBSTRING и CHARINDEX для dbf
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 14.06.2013 в 11:56.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SQL запрос в Delphi. dima1257 Помощь студентам 2 07.06.2013 23:30
delphi и SQL запрос world12_tk Помощь студентам 5 17.05.2012 15:35
найти первый отрицательный элемент массива имеющий чётный номер (Delphi) Vanger Помощь студентам 5 25.01.2011 11:41
Создание новых таблиц в MS SQL SERVERE через SQL запрос в Delphi S_Yevgeniy Помощь студентам 1 27.10.2009 06:26
sql запрос delphi viperrr Помощь студентам 13 03.07.2009 03:08