sql - Есть ли комбинация «LIKE» и «IN» в SQL? In в sql


Как работает «IN» в SQL-запросе db2?

Семейство семейств Sx22 указывает на превышение определенного системного параметра. S322 обычно указывает, что вы превысили количество процессорного времени в параметре TIME на вашей карточке задания или задании, например.

A S722 abend указывает, что вы произвели больше выходных катушек, чем разрешено параметрами JES вашего магазина. Вы должны определить источник этого вывода катушки, чтобы разрешить abend.

Возможно, у вас есть дамп ядра (CEEDUMP), который вы закодировали (SYSOUT или SYSPRINT или STDOUT или STDERR), или код DD отбегающего отчета, который вы закодировали. JESMSGLG DD, видимый в катушке, либо в верхней части вашего вывода в SDSF, либо путем выбора вашей работы с помощью?? может сообщать об ошибках до на S722.

Возможно, у вас есть S322, который ведет к S722. Это вполне возможно, так как проблема возникает с большим количеством данных.

Установка параметра времени для NOLIMIT - это дорогостоящая технология отладки, так как у большинства мейнфреймов есть алгоритм возврата, как правило, время процессора = деньги в чьем-то бюджете. В вашем магазине может быть выход JES, который заменяет какое-либо другое значение для NOLIMIT специально для предотвращения его использования.

Как указано пользователем6542823, вы можете добавить JOBPARM LINES = some-large-number, чтобы обойти S722, но вам все равно придется решить основную проблему.

z/OS пытается предоставить вам как можно больше информации для отладки. Используйте то, что оно дает вам.

Данные ...

  • вы сказали, что ваша программа выполняет отлично с локальными данными испытаний
  • проблема проявляет при работе от резервного производства размерных данные

... то если ...

  • определение таблицы PHONE_TAB в локальной тестовых данных соответствует, что в резервной копии и производственных данных
  • ваша программа связывает успешно
  • у вас есть разрешение, чтобы прочитать резервную копию данных

... проблема, скорее всего, не с SQL, а связан с объемом данных.

Посмотрите на вывод EXPLAIN для вашего пакета, и вы, вероятно, увидите, что сканируете всю таблицу PHONE_TAB. Возможно, в производстве есть индекс, который отсутствует в резервной копии, на которую вы тестируете.

stackoverrun.com

sql - Есть ли комбинация «LIKE» и «IN» в SQL?

В SQL нет комбинации LIKE & IN, а тем более в TSQL (SQL Server) или PLSQL (Oracle). Частично это связано с тем, что рекомендуется использовать полнотекстовый поиск (FTS).

Обе реализации Oracle и SQL Server FTS поддерживают ключевое слово CONTAINS, но синтаксис все еще немного отличается:

Oracle:

WHERE CONTAINS(t.something, 'bla OR foo OR batz', 1) > 0

SQL Server:

WHERE CONTAINS(t.something, '"bla*" OR "foo*" OR "batz*"')

Справка:

вы застряли с

WHERE something LIKE 'bla%' OR something LIKE '%foo%' OR something LIKE 'batz%'

если вы не заселяете временную таблицу (включите в нее дикие карты с данными) и присоединитесь вот так:

FROM YourTable y INNER JOIN YourTempTable t On y.something LIKE t.something

попробуйте (используя синтаксис SQL Server):

declare @x table (x varchar(10)) declare @y table (y varchar(10)) insert @x values ('abcdefg') insert @x values ('abc') insert @x values ('mnop') insert @y values ('%abc%') insert @y values ('%b%') select distinct * FROM @x x WHERE x.x LIKE '%abc%' or x.x LIKE '%b%' select distinct x.* FROM @x x INNER JOIN @y y On x.x LIKE y.y

ВЫВОД:

x ---------- abcdefg abc (2 row(s) affected) x ---------- abc abcdefg (2 row(s) affected)

Я бы предложил использовать пользовательскую функцию TableValue, если вы хотите инкапсулировать методы Inner Join или temp table, показанные выше. Это позволило бы ему читать более четко.

После использования функции split, определенной по адресу: http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx

мы можем написать следующее на основе созданной мной таблицы «Fish» (int id, varchar (50) Name)

SELECT Fish.* from Fish JOIN dbo.Split('%ass,%e%',',') as Splits on Name like Splits.items //items is the name of the output column from the split function.

Выходы

1 Bass 2 Pike 7 Angler 8 Walleye

Вместо этого используйте внутреннее соединение:

SELECT ... FROM SomeTable JOIN (SELECT 'bla%' AS Pattern UNION ALL SELECT '%foo%' UNION ALL SELECT 'batz%' UNION ALL SELECT 'abc' ) AS Patterns ON SomeTable.SomeColumn LIKE Patterns.Pattern

Другое решение должно работать на любой СУБД:

WHERE EXISTS (SELECT 1 FROM (SELECT 'bla%' pattern FROM dual UNION ALL SELECT '%foo%' FROM dual UNION ALL SELECT 'batz%' FROM dual) WHERE something LIKE pattern)

У меня может быть решение для этого, хотя он будет работать только в SQL Server 2008, насколько я знаю. Я обнаружил, что вы можете использовать конструктор строк, описанный в https://.com/a/7285095/894974 для присоединения к «вымышленной» таблице с использованием аналогичного предложения. Это звучит сложнее, чем есть, посмотрите:

SELECT [name] ,[userID] ,[name] ,[town] ,[email] FROM usr join (values ('hotmail'),('gmail'),('live')) as myTable(myColumn) on email like '%'+myTable.myColumn+'%'

Это приведет к тому, что все пользователи получат адрес электронной почты, подобный тем, которые указаны в списке. Надеюсь, это полезно для всех. Проблема немного беспокоила меня.

code-examples.net

sql - Передача varchar с запятыми значениями в функцию SQL Server IN

Не используйте функцию, которая петлиет, чтобы разделить строку!, моя функция ниже будет разделять строку очень быстро, без циклов!

Прежде чем использовать мою функцию, вам нужно настроить таблицу "помощник", вам нужно сделать это только один раз для каждой базы данных:

CREATE TABLE Numbers (Number int NOT NULL, CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] DECLARE @x int SET @x=0 WHILE @x<8000 BEGIN SET @x=@x+1 INSERT INTO Numbers VALUES (@x) END

используйте эту функцию, чтобы разделить вашу строку, которая не работает и очень быстро:

CREATE FUNCTION [dbo].[FN_ListToTable] ( @SplitOn char(1) --REQUIRED, the character to split the @List string on ,@List varchar(8000) --REQUIRED, the list to split apart ) RETURNS @ParsedList table ( ListValue varchar(500) ) AS BEGIN /** Takes the given @List string and splits it apart based on the given @SplitOn character. A table is returned, one row per split item, with a column name "ListValue". This function workes for fixed or variable lenght items. Empty and null items will not be included in the results set. Returns a table, one row per item in the list, with a column name "ListValue" EXAMPLE: ---------- SELECT * FROM dbo.FN_ListToTable(',','1,12,123,1234,54321,6,A,*,|||,,,,B') returns: ListValue ----------- 1 12 123 1234 54321 6 A * ||| B (10 row(s) affected) **/ ---------------- --SINGLE QUERY-- --this will not return empty rows ---------------- INSERT INTO @ParsedList (ListValue) SELECT ListValue FROM (SELECT LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number - 1))) AS ListValue FROM ( SELECT @SplitOn + @List + @SplitOn AS List2 ) AS dt INNER JOIN Numbers n ON n.Number < LEN(dt.List2) WHERE SUBSTRING(List2, number, 1) = @SplitOn ) dt2 WHERE ListValue IS NOT NULL AND ListValue!='' RETURN END --Function FN_ListToTable

вы можете использовать эту функцию в качестве таблицы в соединении:

SELECT Col1, COl2, Col3... FROM YourTable INNER JOIN FN_ListToTable(',',@YourString) s ON YourTable.ID = s.ListValue

Вот ваш пример:

Select * from sometable where tableid in(SELECT ListValue FROM dbo.FN_ListToTable(',',@Ids) s)

qaru.site