背景: 型の列 (foo) を含み、text
型ではないSQL データベースがありますinteger
。列には、整数をtext
フォームに格納します。
質問: ( foo 列に) nSELECT
より大きい/小さい数を含む行は可能ですか?
PS : それらをテキスト形式で保存するのには十分な理由があります。その上でのコメントはご遠慮ください。
更新:(言及するのを忘れた)SQLite3に保存しています。
SELECT foo
FROM Table
WHERE CAST(foo as int)>@n
select *
from tableName
where cast(textColumn as int) > 5
WHERE 句の単純な CAST は、foo 列のデータが適切に整数に変換されることが確実である限り機能します。そうでない場合、SELECT ステートメントはエラーをスローします。ここに追加の手順を追加し、フィールドを int にキャストする前に数値以外の文字を削除することをお勧めします。同様のことを行う方法に関するリンクは次のとおりです。
この関数で行う必要がある唯一の実際の変更は、次の行を変更することです。
PATINDEX('%[^0-9A-Za-z]%', @string)
に
PATINDEX('%[^0-9]%', @string)
その UDF からの結果は、エラーをスローすることなく int にキャストできる必要があります。クエリはさらに遅くなりますが、より安全になります。CAST を UDF 内に配置して、1 回の呼び出しにすることもできます。最終的な UDF は次のようになります。
CREATE FUNCTION dbo.UDF_ParseAlphaChars
(
@string VARCHAR(8000)
)
RETURNS int
AS
BEGIN
DECLARE @IncorrectCharLoc SMALLINT
SET @IncorrectCharLoc = PATINDEX('%[^0-9]%', @string)
WHILE @IncorrectCharLoc > 0
BEGIN
SET @string = STUFF(@string, @IncorrectCharLoc, 1, '')
SET @IncorrectCharLoc = PATINDEX('%[^0-9]%', @string)
END
SET @string = @string
RETURN CAST(@string as int)
END
GO
最終的な SELECT ステートメントは次のようになります。
SELECT *
FROM Table
WHERE UDF_ParseAlphaChars(Foo) > 5
編集
データベースが SQLite であるという新しい情報に基づいて、上記はおそらく直接には機能しません。SQLite が UDF をネイティブにサポートしているとは思えません。選択したプログラミング言語を使用して UDF のタイプを作成できる場合があります (例: http://www.christian-etter.de/?p=439 ) 。
すべてのデータを安全に取得するためのもう 1 つのオプション (IsNumeric は、結果から特定の行を除外しますが、これは望ましくない可能性があります) は、おそらく、文字列の int 表現を持つ追加の列を作成することです。2 つのフィールドの同期を保つ必要があるという点で少し危険ですが、テーブル データの並べ替えとフィルター処理をすばやく行うことができます。
SELECT *
FROM Table
WHERE CAST(foo as int) > 2000