Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Вниз

Помогите составить запрос   Найти похожие ветки 

 
Dell3r ©   (2005-05-17 11:57) [0]

В сомбобоксе вводится слово. в процессе ввода нужно оставлять записи соответствующие вводимым символам без учета регистра
Я пишу:

procedure TForm.CBNameKeyPress(Sender: TObject; var Key: Char);
Memo1.Lines.Strings[1]:="Where Name like "%"+CBName.Text+"%"";
QueryTMC.SQL.Assign(Memo1.lines);
QueryTMC.Open;

Вроде всё работает но если ввожу слово "лада", то среди записей есть "Влад"


 
ANB ©   (2005-05-17 11:59) [1]

Так и должно быть. %лада% - все строки, содержащие лада. Убери % в начале.


 
ANB ©   (2005-05-17 12:00) [2]

И почитай про LIKE в хэлпе.


 
Dell3r ©   (2005-05-17 12:03) [3]

А как без учета регистра Записей типа "Лада" там нету там только "лада"


 
Dell3r ©   (2005-05-17 12:06) [4]

Если убрать в начале %, то поиск производится с начала записи.
А мне нужны так же записи "Экспо-лада"


 
msguns ©   (2005-05-17 12:07) [5]

SQL.ADD(".. WHERE SUBSTRINR(<Имя_поля> FROM 1 FOR "+IntToStr(Length(Combo.Text))+")="+QuotedStr(Combo.Text));

(Help+LocalSQL)


 
ANB ©   (2005-05-17 12:09) [6]

SQL так не умеет. MS SQL, кажись, умеет регистр игнорить, а Oracle уже нет. Придется тебе заводить служебное поле в верхнем регистре, а для поиска слов - отдельную таблицу-словарик.


 
msguns ©   (2005-05-17 12:12) [7]

>ANB ©   (17.05.05 12:09) [6]
>SQL так не умеет. MS SQL, кажись, умеет регистр игнорить, а Oracle уже нет.

А причем здесь скала с оруклом ?


 
Dell3r ©   (2005-05-17 12:14) [8]

Я в sql не силён он ругается на From.
Насколько я понимаю нужно писать

Select * from base
where SUBSTRINR(Name FROM 1 FOR "+IntToStr(Length("лада"))+")="+QuotedStr("лада")


 
Sergey13 ©   (2005-05-17 12:16) [9]

А почему нельзя просто
Memo1.Lines.Strings[1]:="Where UPPER(Name) like "%"+AnsiUpperCase(CBName.Text)+"%"";
?


 
ANB ©   (2005-05-17 12:18) [10]


> А причем здесь скала с оруклом ?
- да это для примера. Local SQL тоже не умеет регистр игнорить. В Oracle я завожу доп поле. В триггере заношу в него строку в верхнем регистре из основного и цепляю на него индекс. Как он будет так с локальными БД изгалятся - не знаю. Особенно, если нужен поиск по словам. В принципе, у FoxPro есть индексы с формулами и можно применить функцию типа Upper (забыл как в фоксе она называется), но, кажись в DOS кодировке она не работала.


 
msguns ©   (2005-05-17 12:18) [11]

Да, только приведенный мною пример будет выбирать записи, у которых строки начинаются на текст комбобокса. Если надо начхать на регистр, то слева и справа предиката добавить LOWER или UPPER

Однако, как я понял из [4], это не устроит. В этом случае ничего лучше, чем сканировать НД на предмет вхождения подстроки в строку для лок.БД я не знаю.


 
ANB ©   (2005-05-17 12:20) [12]


> А почему нельзя просто
- потому что в поле у него может быть в нижнем. Тоже самое, если написать "%ЛАДА%". А ошибка будет прежней. Без словарика тут не обойтись.
Кстати, а зачем здесь посредник Memo1 ???


 
Sergey13 ©   (2005-05-17 12:21) [13]

2[10] ANB ©   (17.05.05 12:18)
Так вроде можно индекс по функции сделать. Я правда не пробовал - у меня стандарт эдишн был.


 
ANB ©   (2005-05-17 12:21) [14]


> msguns ©   (17.05.05 12:18) [11]
ну так тогда проще like "ЛАДА%"


 
msguns ©   (2005-05-17 12:23) [15]

>ANB ©   (17.05.05 12:18) [10]
> Local SQL тоже не умеет регистр игнорить.

???

UPPER/LOWER


 
ANB ©   (2005-05-17 12:28) [16]


> msguns ©   (17.05.05 12:23) [15]
, не, это не то. Это ручками. МикроСкуль умеет без так игнорить. Просто пишешь в любом регистре запрос, а он достает все строки с игнорированием регистра.


 
msguns ©   (2005-05-17 12:35) [17]

>ANB ©   (17.05.05 12:28) [16]
>, не, это не то. Это ручками.

Из справки по Local SQL:

Converts all characters to lowercase.

LOWER(column_reference)

Description

Use LOWER to convert all of the characters in a character value (column, literal, parameter, or caculated values) to lowercase. For example, in the SELECT statement below the values in the Name column appear all in lowercase.

SELECT LOWER(Name)

FROM Country

When applied to retrieved data of a SELECT statement, the effect is transient and does not affect stored data. When applied to the update atoms of an UPDATE statement, the effect is persistent and permanently converts the case of the stored values.

The LOWER function can be used in WHERE clause string comparisons to effect a case-insensitive comparison. Apply LOWER to the values on both sides of the comparison operator (if one of the comparison values is a literal, simply enter it all in lower case).

SELECT *

FROM Cames

WHERE LOWER(LastName) = "smith"

Applicability

LOWER can only be used with character columns or literals. To use on values of other data types, the values must first be converted to CHAR using the CAST function.

Note: The LOWER function cannot be used with memo or BLOB columns.
Note: The lower case version of a given character is determined by the language driver used.


 
Dell3r ©   (2005-05-17 12:36) [18]

Вот пример [9] в принципе подошел, но опять таки он выводит
например Алладин, хотя совпадает только лад, то есть как будто последний введенный символ не учитывается.


 
Max Zyuzin ©   (2005-05-17 12:40) [19]

>Dell3r ©   (17.05.05 11:57)  
Все это похоже на фигню какую то. Попробуй перед выполнением запроса куда нить выведи QueryTMC.SQL.Text и сразу увидишь какой реально запрос у тебя выполнялся. Запости его сюда. Я так понял что у тебя запрос берется из Memo. Вот введи в комбобоксе совем слово "Лада" и SQL.Text сюда напиши.


 
ANB ©   (2005-05-17 12:42) [20]


> msguns ©   (17.05.05 12:35) [17]
- да не кипятись. Знаю я про это. Не грю же, что вообще никак. Но если пишешь Upper(Field) = Upper(SearchStr), то индексы не юзаются. Я про то, что сиквел умеет в индексах игнорить регистр. И, это, с русскими пробовал ? Я не уверен, но натыкался на проблемы. Но в самом FoxPro, не в Local SQL.

> Dell3r ©   (17.05.05 12:36) [18]
- все примеры - небольшая модернизация твоего. SQL не умеет понимать, что ты хочешь только целиком слово. Это ручками надо делать.


 
msguns ©   (2005-05-17 12:47) [21]

>ANB ©   (17.05.05 12:42) [20]
>- да не кипятись.

ни боже мой ;)

>Но если пишешь Upper(Field) = Upper(SearchStr), то индексы не юзаются. Я про то, что сиквел умеет в индексах игнорить регистр.

Неужели ? Попутно вопрос: чем отличается "сиквел" о "Local SQL" ?

>И, это, с русскими пробовал ? Я не уверен, но натыкался на проблемы. Но в самом FoxPro, не в Local SQL.

Слышал об этом. Сам с фоксом не работаю


 
Dell3r ©   (2005-05-17 12:47) [22]

Я понял нужно обрабатывать CBNameKeyUp(Sender: TObject; var Key: Word;

sql.text:

Select * from Name
Where UPPER(Name) like
"%ЛАДА%"
%ORDER


 
ANB ©   (2005-05-17 12:49) [23]


> Неужели ? Попутно вопрос: чем отличается "сиквел" о "Local
> SQL" ?
- я про MS SQL говорю.


> >Но если пишешь Upper(Field) = Upper(SearchStr
- факт. В оракле сразу план на фулл скан переходит.


 
Max Zyuzin ©   (2005-05-17 12:50) [24]

>Dell3r ©   (17.05.05 12:47) [22]
А нафига если не секрет это все нужно вводить в Комбобокс? Чем не угодил Edit?


 
msguns ©   (2005-05-17 12:54) [25]

>ANB ©   (17.05.05 12:49) [23]
>- я про MS SQL говорю.

"Сиквелем" вообще-то обзывают SQL вообще. Любой. И причем здесь "скала" (я так называю твой MS SQL) ?
Андрюха, с своим уставом во все монастыри ?
;)))


 
Anatoly Podgoretsky ©   (2005-05-17 12:54) [26]

У тебя явно поврежденная база.


 
Dell3r ©   (2005-05-17 12:55) [27]

1.Будет вестись история запросов.
2.При нажатии энтер обрабатывается кнопка Default которой равен true


 
Dell3r ©   (2005-05-17 12:56) [28]

>>Anatoly Podgoretsky ©  (17.05.05 12:54) [26]

с чего это?


 
ANB ©   (2005-05-17 12:57) [29]


> Андрюха, с своим уставом во все монастыри ?
- ну давай тоже буду скала писать. Это у меня со старой работы. Мы там конвертили Oracle -> MS SQL и привыкли его сиквелом называть. Может какой нибудь общепонятный термин на русском изобретем, а то надоело раскладку переключать ?


 
msguns ©   (2005-05-17 13:03) [30]

>ANB ©   (17.05.05 12:57) [29]
>- ну давай тоже буду скала писать. Это у меня со старой работы. Мы там конвертили Oracle -> MS SQL и привыкли его сиквелом называть. Может какой нибудь общепонятный термин на русском изобретем, а то надоело раскладку переключать ?

Хорошая идея, поддерживаю. Мне "скала" тоже не слишком.. Во-первых, есть одноименная банковская буржуйная сиса, во-вторых, на скалу ИМХО, MS SQL мало похож, - скорее на Джомолумгму со своим весом и прибамбасами ;))


 
ANB ©   (2005-05-17 13:18) [31]

Ну дык и где мастера ? Кто предложит понятный русский термин ?
Предлагаю "МелкоСкуль".


 
Sergey13 ©   (2005-05-17 13:21) [32]

МяСной Скуль. 8-)


 
msguns ©   (2005-05-17 13:38) [33]

Мскаль (когда произносится быстро, звучит занятно)



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.045 c
10-1095068388
jiuraoihiophk
2004-09-13 13:39
2005.06.29
Уничтожение OLE обьекта


6-1112085248
Ves
2005-03-29 12:34
2005.06.29
Автоввод логина и пароля на проксю


6-1112326674
atruhin
2005-04-01 07:37
2005.06.29
Влияние Content-Length на Keep-Alive в HTTP протоколе


3-1116090393
VarAX
2005-05-14 21:06
2005.06.29
И снова вопрос по InterBase


11-1101102013
Shaman O Mega
2004-11-22 08:40
2005.06.29
Proxies.dcu MCK&amp;KOL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский