Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Не могу разобраться в 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 пробовал, то же самое. Что не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 09:24 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
Darkhan Darkhan, Может быть убрать %ID %STARTSWITH :ID ? Странное условие... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 11:36 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
Условие_BAD, нет не от этого. Если в базе будет: 1 TestFam TestImiya Testot4 2 TestFam2 TestImiya2 Testot42 Запрос возвращает обе записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 12:13 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
может быть дело в том что пустое значение есть NULL, и его нельзя сравнить с помощью LIKE или %STARTSWITH ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 12:19 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
DAiMor, я сначало так и думал. Но потом присвоил пустое значение: s p.MiddleName="" Тот же эффект... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 12:36 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
Darkhan Darkhan , Сам запрос неверный: он не учитывает входные параметры на NULL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 12:38 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
servit, Можете по подробнее, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 12:42 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
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 , Поздравляю с призовым местом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 13:22 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
Darkhan DarkhanDAiMor, я сначало так и думал. Но потом присвоил пустое значение: s p.MiddleName="" Тот же эффект... и что по вашему изменилось ? а вы не думали что "" и NULL одно и тоже что касается строки ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 13:45 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
servit DAiMor , Поздравляю с призовым местом. Спасибо, хотя думаю у многих здесь были бы может и лучше результаты, если бы знали о конкурсе. да и призов вроде не обещали. я немного неточно понял задание и не оптимизировал сами тесты, а только таблицы по которым тесты идут. тот что получил 1 место он как раз оптимизировал и тесты и получил лучший результат. хотя местами видны промашки со стороны IS, когда на один запрос берутся по несколько раз одни и те же данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 13:48 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
DAiMor, Про че речь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 14:47 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.DAiMor, Про че речь? про это servit DAiMor , Поздравляю с призовым местом. прошедший конкурс SQL Performance, о котором было написано на портале разработчиков IS https://developer.intersystems.com ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 15:14 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
DAiMorи что по вашему изменилось ? а вы не думали что "" и NULL одно и тоже что касается строки ? Я думал это разные вещи. Servit, Спасибо. Но, осталось одна проблема: Когда поиск делаю по отчеству пустые поля Отчечтво тоже возвращаются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2012, 08:30 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
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? Без него лучше работает: пустые поля не возвращают при любом запросе... Или я что-то не учел? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2012, 08:40 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
Darkhan DarkhanЗачем использовать nvl? Без него лучше работает: пустые поля не возвращают при любом запросе... Или я что-то не учел?Нет, это я скорее не учёл, что же всё-таки Вам было нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2012, 09:04 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
servit, Понятно. Без nvl, но с учетом null меня пока устраивает. Спасибо большое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2012, 09:10 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
Darkhan DarkhanЯ думал это разные вещи. Они иногда совпадают... Тут на форуме есть целое исследование по этому поводу... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2012, 09:43 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
krvsaТут на форуме есть целое исследование по этому поводу...Было дело: Обработка <пусто> в каше Darkhan Darkhan , Вам будет не лишним почитать этот топик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2012, 09:56 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
Добрый день. Это снова я с вопросами: Думал следующим кодом проблема решена, но оказалось при большом объеме этот код работает очень медленно: &sql(DECLARE C1 CURSOR FOR SELECT TOP 25 %ID,Name INTO :id, :name FROM Person WHERE(nvl(:%request.Get("reg_n"),%ID) = %ID ) ) Как можно ускорить? Смысл кода: если есть ID то одного, если нет то всех. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2012, 11:00 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
Darkhan DarkhanСмысл кода: если есть ID то одного, если нет то всех. Просто сделать 2 разных запроса и вызывать нужный по условию... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2012, 11:05 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
krvsa, Хорошая идея, но там у меня около 10 полей для проверки. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2012, 11:10 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
Darkhan Darkhan , решать тебе... Быстрее всего работают простые "специализированные" запросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2012, 11:42 |
|
||
|
SQL. Пустые строки. STARTSWITH.
|
|||
|---|---|---|---|
|
#18+
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. С индексом Код: plaintext 1. 2. Планы запроса для обоих вариантов можно посмотреть в Портале. PS: поскольку у Вас параметров для поиска много (около 10 полей), то лучше создать по некоторым из них bitmap-индекс. В этом случае экстентный индекс будет создан автоматически: Generating a Bitmap Extent Index ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2012, 15:51 |
|
||
|
|

start [/forum/topic.php?fid=39&msg=37823708&tid=1557443]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
62ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
| others: | 250ms |
| total: | 423ms |

| 0 / 0 |
