Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / SQL. Пустые строки. STARTSWITH. / 24 сообщений из 24, страница 1 из 1
04.06.2012, 09:24
    #37823708
Darkhan Darkhan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
Доброго времени суток.
Не могу разобраться в sql запросе.
авторQuery Search(ID As %String, LastName As %String, Name As %String, MiddleName As %String) As %SQLQuery(CONTAINID = 1)
{
SELECT %ID,Age,DOB,IIN,LastName,MiddleName,Name,Notes,Gender FROM Patient
WHERE (%ID %STARTSWITH :ID AND LastName %STARTSWITH :LastName AND Name %STARTSWITH :Name AND MiddleName %STARTSWITH :MiddleName)
ORDER BY LastName
}

Он мне не возвращает если какое то значение пустое в Базе. Например, там 2 записи:
1 TestFam TestImiya Testot4
2 TestFam2 TestImiya2

Запрос возвращает мне только первую запись.

LIKE пробовал, то же самое. Что не так?
...
Рейтинг: 0 / 0
04.06.2012, 11:36
    #37823894
Условие_BAD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
Darkhan Darkhan, Может быть убрать %ID %STARTSWITH :ID ? Странное условие...
...
Рейтинг: 0 / 0
04.06.2012, 12:13
    #37823974
Darkhan Darkhan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
Условие_BAD, нет не от этого. Если в базе будет:
1 TestFam TestImiya Testot4
2 TestFam2 TestImiya2 Testot42

Запрос возвращает обе записи.
...
Рейтинг: 0 / 0
04.06.2012, 12:19
    #37823983
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
может быть дело в том что пустое значение есть NULL, и его нельзя сравнить с помощью LIKE или %STARTSWITH
...
Рейтинг: 0 / 0
04.06.2012, 12:36
    #37824021
Darkhan Darkhan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
DAiMor, я сначало так и думал. Но потом присвоил пустое значение:

s p.MiddleName=""

Тот же эффект...
...
Рейтинг: 0 / 0
04.06.2012, 12:38
    #37824028
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
Darkhan Darkhan ,

Сам запрос неверный: он не учитывает входные параметры на NULL.
...
Рейтинг: 0 / 0
04.06.2012, 12:42
    #37824032
Darkhan Darkhan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
servit,
Можете по подробнее, пожалуйста.
...
Рейтинг: 0 / 0
04.06.2012, 13:22
    #37824118
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
Darkhan Darkhanservit,
Можете по подробнее, пожалуйста.Query Search(
  ID As %String,
  LastName As %String,
  Name As %String,
  MiddleName As %String) As %SQLQuery(CONTAINID = 1)
{
SELECT %ID,Age,DOB,IIN,LastName,MiddleName,Name,Notes,Gender FROM Patient WHERE
 (nvl(%ID,:ID) %STARTSWITH :ID or :ID is null) AND
 (nvl(LastName,:LastName) %STARTSWITH :LastName or :LastName is null) AND
 (nvl(Name,:Name) %STARTSWITH :Name or :Name is null) AND
 (nvl(MiddleName,:MiddleName) %STARTSWITH :MiddleName or :MiddleName is null)
 ORDER BY LastName
}

DAiMor ,

Поздравляю с призовым местом.
...
Рейтинг: 0 / 0
04.06.2012, 13:45
    #37824170
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
Darkhan DarkhanDAiMor, я сначало так и думал. Но потом присвоил пустое значение:

s p.MiddleName=""

Тот же эффект...

и что по вашему изменилось ?
а вы не думали что "" и NULL одно и тоже что касается строки ?
...
Рейтинг: 0 / 0
04.06.2012, 13:48
    #37824176
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
servit DAiMor ,

Поздравляю с призовым местом.
Спасибо, хотя думаю у многих здесь были бы может и лучше результаты, если бы знали о конкурсе. да и призов вроде не обещали.
я немного неточно понял задание и не оптимизировал сами тесты, а только таблицы по которым тесты идут. тот что получил 1 место он как раз оптимизировал и тесты и получил лучший результат. хотя местами видны промашки со стороны IS, когда на один запрос берутся по несколько раз одни и те же данные.
...
Рейтинг: 0 / 0
04.06.2012, 14:47
    #37824316
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
DAiMor,

Про че речь?
...
Рейтинг: 0 / 0
04.06.2012, 15:14
    #37824382
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
Блок А.Н.DAiMor,

Про че речь?
про это
servit DAiMor ,

Поздравляю с призовым местом.
прошедший конкурс SQL Performance, о котором было написано на портале разработчиков IS https://developer.intersystems.com
...
Рейтинг: 0 / 0
05.06.2012, 08:30
    #37825238
Darkhan Darkhan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
DAiMorи что по вашему изменилось ?
а вы не думали что "" и NULL одно и тоже что касается строки ?

Я думал это разные вещи.

Servit,

Спасибо. Но, осталось одна проблема: Когда поиск делаю по отчеству пустые поля Отчечтво тоже возвращаются.
...
Рейтинг: 0 / 0
05.06.2012, 08:40
    #37825244
Darkhan Darkhan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
servitQuery Search(
ID As %String,
LastName As %String,
Name As %String,
MiddleName As %String) As %SQLQuery(CONTAINID = 1)
{
SELECT %ID,Age,DOB,IIN,LastName,MiddleName,Name,Notes,Gender FROM Patient WHERE
(nvl(%ID,:ID) %STARTSWITH :ID or :ID is null) AND
(nvl(LastName,:LastName) %STARTSWITH :LastName or :LastName is null) AND
(nvl(Name,:Name) %STARTSWITH :Name or :Name is null) AND
(nvl(MiddleName,:MiddleName) %STARTSWITH :MiddleName or :MiddleName is null)
ORDER BY LastName
}


Зачем использовать nvl? Без него лучше работает: пустые поля не возвращают при любом запросе... Или я что-то не учел?
...
Рейтинг: 0 / 0
05.06.2012, 09:04
    #37825270
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
Darkhan DarkhanЗачем использовать nvl? Без него лучше работает: пустые поля не возвращают при любом запросе... Или я что-то не учел?Нет, это я скорее не учёл, что же всё-таки Вам было нужно.
...
Рейтинг: 0 / 0
05.06.2012, 09:10
    #37825274
Darkhan Darkhan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
servit,

Понятно. Без nvl, но с учетом null меня пока устраивает.

Спасибо большое.
...
Рейтинг: 0 / 0
05.06.2012, 09:43
    #37825318
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
Darkhan DarkhanЯ думал это разные вещи.
Они иногда совпадают...
Тут на форуме есть целое исследование по этому поводу...
...
Рейтинг: 0 / 0
05.06.2012, 09:56
    #37825344
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
krvsaТут на форуме есть целое исследование по этому поводу...Было дело: Обработка <пусто> в каше

Darkhan Darkhan ,

Вам будет не лишним почитать этот топик.
...
Рейтинг: 0 / 0
19.06.2012, 11:00
    #37843828
Darkhan Darkhan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
Добрый день. Это снова я с вопросами:
Думал следующим кодом проблема решена, но оказалось при большом объеме этот код работает очень медленно:
&sql(DECLARE C1 CURSOR FOR
SELECT TOP 25 %ID,Name
INTO :id, :name
FROM Person
WHERE(nvl(:%request.Get("reg_n"),%ID) = %ID )
)


Как можно ускорить? Смысл кода: если есть ID то одного, если нет то всех.
...
Рейтинг: 0 / 0
19.06.2012, 11:05
    #37843836
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
Darkhan DarkhanСмысл кода: если есть ID то одного, если нет то всех.
Просто сделать 2 разных запроса и вызывать нужный по условию...
...
Рейтинг: 0 / 0
19.06.2012, 11:10
    #37843852
Darkhan Darkhan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
krvsa,

Хорошая идея, но там у меня около 10 полей для проверки. :)
...
Рейтинг: 0 / 0
19.06.2012, 11:42
    #37843918
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
Darkhan Darkhan , решать тебе...
Быстрее всего работают простые "специализированные" запросы.
...
Рейтинг: 0 / 0
19.06.2012, 15:51
    #37844644
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
Darkhan DarkhanКак можно ускорить? Смысл кода: если есть ID то одного, если нет то всех.Создайте экстентный bitmap-индекс, а сам запрос немного видоизмените:

SELECT TOP 25 %ID,Name
 INTO :id, :name
 FROM Person
 WHERE %ID = :%request.Get("reg_n") or :%request.Get("reg_n") is null
Тестовый примерClass test.A Extends %Persistent
{

// Index iExt [ Extent, Type = bitmap ];

ClassMethod Fill(N As %Integer = 1000000)
{
  k ^test.AD
  k ^test.AI

  f i=1:1:N s ^test.AD(i)=$lb("")
  s ^test.AD=N
  
  d ..%BuildIndices()
}

ClassMethod Test()
{
  s t=$ZH
  s n=586187 ##;""
  &sql(declare c cursor for select top 25 %ID from test.A where (%ID=:n or :n is null) for read only)
  &sql(open c)
  f  {
    &sql(fetch c into :id)
    q:SQLCODE
    w "id= ",id,!
  }
  &sql(close c)
  w "Время выполнения= ",$zh-t," сек.",!
}

}

Результаты для миллиона записей:

Без индекса

Код: plaintext
1.
2.
USER>d ##class(test.A).Test()
id= 586187
Время выполнения= .444925 сек.


С индексом

Код: plaintext
1.
2.
USER>d ##class(test.A).Test()
id= 586187
Время выполнения= .000058 сек.

Планы запроса для обоих вариантов можно посмотреть в Портале.

PS: поскольку у Вас параметров для поиска много (около 10 полей), то лучше создать по некоторым из них bitmap-индекс. В этом случае экстентный индекс будет создан автоматически: Generating a Bitmap Extent Index
...
Рейтинг: 0 / 0
19.06.2012, 16:42
    #37844780
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL. Пустые строки. STARTSWITH.
Вообще сама манера задания вопроса странная...
- Как мне ускорить вот это?
- Вот так...
- Так-то оно так... Но у меня на самом деле вообще не то, что я показал ранее!

Остаётся только бубен!
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / SQL. Пустые строки. STARTSWITH. / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]