Это старый остаток от дней, когда для отличия выражений от операторов был больше синтаксического сахара.
В принципе, запятая была использована как разделитель элементов списка, поэтому точка с запятой использовалась как " список операторов "разделитель. Недостаток заключается в обработке нулевых элементов в списках и нулевых операторов в блоках.
В списке элементов Java использует явное ключевое слово null
, но «нулевой оператор» является просто пустым линия. Разрешение существования пустой строки - это удержание из традиции, унаследованной от C.
Зачем? Особенно с инструкцией if
, когда вы знаете, что никакие утверждения не выполняются: поскольку некоторые операторы if имеют побочные эффекты:
int c;
if ((c = in.read()) != -1);
Да, это не лучший пример, но в основном он говорит, что читать байт из потока и ничего не делать. Может быть полезно в некоторых случаях, но даже если этот пример не самый лучший, он иллюстрирует намерение. Мы хотим ощущать побочные эффекты выражения без случайного выполнения каких-либо утверждений.
Сценарий RichardTheKiwi в функции для использования в selects without cross apply также добавляется, потому что в моем случае я использую его для двойных и денежных значений в поле varchar
CREATE FUNCTION dbo.ReplaceNonNumericChars (@string VARCHAR(5000))
RETURNS VARCHAR(1000)
AS
BEGIN
SET @string = REPLACE(@string, ',', '.')
SET @string = (SELECT SUBSTRING(@string, v.number, 1)
FROM master..spt_values v
WHERE v.type = 'P'
AND v.number BETWEEN 1 AND LEN(@string)
AND (SUBSTRING(@string, v.number, 1) LIKE '[0-9]'
OR SUBSTRING(@string, v.number, 1) LIKE '[.]')
ORDER BY v.number
FOR
XML PATH('')
)
RETURN @string
END
GO
Спасибо RichardTheKiwi +1
Хорошо, если вы действительно не можете использовать функцию, я полагаю, вы могли бы сделать что-то вроде этого:
SELECT REPLACE(REPLACE(REPLACE(LOWER(col),'a',''),'b',''),'c','')
FROM dbo.table...
Очевидно, это было бы намного уродливее, чем это, поскольку я обрабатывал только первые три буквы, но это должно дать идею.
REPLACE(..,Char(244),'')
и т. Д.
– RichardTheKiwi
20 September 2012 в 02:37
CTE для HELP здесь.
;WITH CTE AS
(
SELECT
[ProductNumber] AS OrigProductNumber
,CAST([ProductNumber] AS VARCHAR(100)) AS [ProductNumber]
FROM [AdventureWorks].[Production].[Product]
UNION ALL
SELECT OrigProductNumber
,CAST(STUFF([ProductNumber], PATINDEX('%[^0-9]%', [ProductNumber]), 1, '') AS VARCHAR(100) ) AS [ProductNumber]
FROM CTE WHERE PATINDEX('%[^0-9]%', [ProductNumber]) > 0
)
SELECT * FROM CTE
WHERE PATINDEX('%[^0-9]%', [ProductNumber]) = 0
OPTION (MAXRECURSION 0)
вывод:
OrigProductNumber ProductNumber
WB-H098 098
VE-C304-S 304
VE-C304-M 304
VE-C304-L 304
TT-T092 092
Вы можете сделать это в одном заявлении. Вы действительно не создаете инструкцию с 200 + REPLACE, вы?!
update tbl
set S = U.clean
from tbl
cross apply
(
select Substring(tbl.S,v.number,1)
-- this table will cater for strings up to length 2047
from master..spt_values v
where v.type='P' and v.number between 1 and len(tbl.S)
and Substring(tbl.S,v.number,1) like '[0-9]'
order by v.number
for xml path ('')
) U(clean)
Working SQL Fiddle , показывающий этот запрос с образцами данных
Replicated ниже для потомков:
create table tbl (ID int identity, S varchar(500))
insert tbl select 'asdlfj;390312hr9fasd9uhf012 3or h239ur ' + char(13) + 'asdfasf'
insert tbl select '123'
insert tbl select ''
insert tbl select null
insert tbl select '123 a 124'
Результаты
ID S
1 390312990123239
2 123
3 (null)
4 (null)
5 123124