我最近開始在查詢中使用 RegEx 作為條件,但似乎 T-SQL 對官方語法的支持有限。
例如,我希望測驗一個字串在 00:00 到 23:59 之間的時間是否有效,一個好的 RegEx 運算式將是 "([0-1][0-9]|[2][0 -3]):([0-5][0-9])":
select iif('16:06' like '([0-1][0-9]|[2][0-3]):([0-5][0-9])', 'Valid', 'Invalid')
..失敗并輸出“無效”。我是否正確理解 T-SQL 不能處理分組和條件 (|)?我懶洋洋地使用了一個沒有正確測驗字串的簡化正則運算式——我對此相當不滿意:
select iif('16:06' like '[0-2][0-9]:[0-5][0-9]', 'Valid, 'Invalid')
.. 它回傳“有效”,但也將字串“28:06”視為有效。
我知道我可以添加進一步的檢查來全面檢查它是否是有效的時間字串,但我更愿意充分利用 RegEx。
簡單地問:我是否只是在做或認為這是一個限制錯誤,如果是的話 - 我如何在 T-SQL 中使用正確的 RegEx?
uj5u.com熱心網友回復:
您可以使用以下邏輯:
SELECT IIF('16:06' LIKE '[01][0-9]:[0-5][0-9]' OR
'16:06' LIKE '2[0-3]:[0-5][0-9]', 'Valid', 'Invalid');
第一個LIKE運算式匹配00:00到19:59,第二個LIKE匹配20:00到23:59。如果 SQL Server 支持完整的正則運算式,我們可以只使用一個帶有交替的正則運算式。
uj5u.com熱心網友回復:
用于LIKE和PATINDEX的模式語法比通常所說的正則運算式要有限得多。
在標準 SQL 中,它實際上只有 2 個特殊字符。
%: 0 個或更多字符的通配符
_: 任意 1 個字符
T-SQL 將字符類添加[...]到語法中。
但是要測驗一個字串是否包含時間,使用LIKE它可能會很笨拙。
在 MS Sql Server 中,可以使用TRY_CONVERT或TRY_CAST函式。如果轉換為資料型別失敗,它們將回傳 NULL。
select IIF(TRY_CAST('16:06' AS TIME) IS NOT NULL, 'Valid', 'Invalid')
uj5u.com熱心網友回復:
我建議使用 SQLCLR 撰寫用戶定義的函式。由于 .Net 支持正則運算式,因此您可以將其移植到 T-SQL。Google 中的第一個鏈接給出了這個實作,但可能還有其他(更好的)實作。
警告 - 使用 SQLCLR 需要提升權限,如果實施不正確,可能會導致安全問題或性能問題,甚至可能導致 SQL Server 穩定性問題。但是,如果您知道自己在做什么,這可能會導致針對您的用例的 T-SQL 的顯著增強。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/454826.html
